1添加最简单的Linux内核模块

一.实验目的

1 熟练掌握基本的Linux内核模块开发框架和编译方法。
2 熟练掌握Linux内核模块添加流程。
3 理解Linux内核模块代码中的一些常见宏和参数。
4 掌握Linux内核模块程序和应用程序的差异。

二.实验背景

2.1用户态与内核态

图1.1 用户态与内核态关系示意图

2.2Linux内核模块LKM (Linux Kernel Module)

1)Linux是单内核多模块的操作系统
·两种开发内核模块的方法
·静态开发
·LKM

2)LKM具有如下特点:
·主要使用C语言编程,但也可以使用内联的汇编代码;
·LKM工作在内核空间,可以不受约束的运行,因此在一个LKM内部读者可以访问对应用程序屏蔽的内核数据结构、硬件设备等;
·LKM可以通过proc伪文件系统、内存映射、特定的系统调用函数等不同的机制实现内核空间和用户空间的数据交换。

三.关键代码及分析

实验1:添加最简单的内核模块kello

1.Kello.c

linux/module.h路径:/lib/modules/4.4.0-142-generic/build/include/linux

1)任何一个内核模块文件必须要有两个模块管理函数,即模块初始化函数和模块回收函数,其原型如下所示:
int init_module( void ); // 模块初始化函数,在模块初始化时被调用
void cleanup_module( void ); //模块回收函数,在模块撤销时调用
2)为了模块更高效地被加载、执行和撤销,尤其是内存的分配和回收,在文件最后需要作如下声明:
module_init(init_module); //执行模块初始化函数
module_exit(cleanup_module); //执行模块回收函数

2.Makefile

在上述Makefile文件中KERNELRELEASE是在Linux内核源代码顶层Makelile中定义的一个变量,在第一次读取执行此 Makefile文件时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
如果make的目标是clean. 直接执行clean操作,然后结束。当没有声明make的目标时,make执行默认操作,即default 后的指令,此时-C $ (KDIR)指明跳转到内核源代码目染下读取那里的Makefiles SUBDIRS $ (PWD) 表明需要返回到当前目录继续读人、执行当前的Makefile.当从内核源代码目录返回时, KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。

实验2:内核模块输出信息显示

·Linux内核定义的0~7总计8个日志级别时间,分别是:
static char * log_level[] = {
“KERN_EMERG”,
“KERN_ALERT”,
“KERN_CRIT”,
“KERN_ERR”,
“KERN_WARNING”,
“KERN_NOTICE”,
“KERN_INFO”,
“KERN_DEBUG”
};
其中KERN_EMERG为0,表示等级最高。如果在调用printk时使用该日志级别,则信息可以直接显示在文本控制台。
语法格式:
printk( “<0> Hello, students from SDUST! This is in kernel space! \n" );
或则:
printk( KERN_EMERG “\n Hello, students from SDUST! This is in kernel space! \n” );

1.kello.c

2.Makefile和实验1一样

四.实验结果与分析

实验1:添加最简单的内核模块kello

1.kello.c的编译

·make

生成两个文件,一个是kello.ko,一个是modules.order。打开modules.order文件可以看到其内容为kernel//home/wct/os/ch12/kello.ko,其中kernel表明这是内核模块,//后的字符串指明了内核模块的位置。

2.LKM的添加和删除

添加和撤销LKM模块都需要root权限。在运行时需要在命令前面加sudo命令来执行。添加和撤销LKM模块的命令分别是insmod和rmmod

1)insmod添加

·查看内核日志中的信息(dmesg)

模块初始化成功后日志写入 Hello, students from SDUST! This is in kernel space!

·通过lsmod命令查看linux中已经加载的模块信息

2)rmmod撤销


·查看日志

撤销成功后日志中写入了 Goodbye now… students from SDUST!

实验2:内核模块输出信息显示

1.kello.c的编译

·make

由于某些Linux系统只能在命令行界面显示内核信息。可用Ctrl+Alt+F1 和 Ctrl+Alt+F7 实现图形界面和命令行界面之间的切换。

1)insmod添加

2)rmmod撤销

由于日志设置的是最高等级所以在命令行界面直接显示了内核信息。

3)dmesg查看日志

练习:

12-1:

这样定义KDIR和PWD不用手动的写出系统的发行号和当前路径,执行是自动获取,使得程序换了路径和系统后不用修改也能正常执行。

12-2:
linux/module.h路径:/lib/modules/4.4.0-142-generic/build/include/linux
·MODULE_DESCRIPTION(); // 描述模块的功能

12-3:显示位置信息

__FILE__表示源代码文件的名称,以绝对路径的方式表示;__LINE__表示行,即printk在这个源代码文件中的第几行,给出了调测点具体观察位置的信息;FUNCYION,表示处在哪个函数中。

12-4:


因为kello_init()为模块的初始化,按照约应当返回0是表示初始化成功,而此处返回了1他会认为是可疑的。但是模块添加到了内核中。

1添加最简单的Linux内核模块相关推荐

  1. 添加简单的linux内核模块,操作系统实践 第12章-添加最简单的Linux内核模块.ppt

    操作系统实践 第12章-添加最简单的Linux内核模块.ppt 文档编号:310662 文档页数:16 上传时间: 2018-07-21 文档级别: 文档类型:ppt 文档大小:2.00MB 第12章 ...

  2. 实验一 添加最简单的Linux内核模块kello

    实验一 添加最简单的Linux内核模块kello 目录 实验一 添加最简单的Linux内核模块kello 实验环境 一.实验目的 二.实验内容 三.实验步骤 四.实验总结 实验环境 操作系统版本:ub ...

  3. Linux内核模块的概念和基本的编程方法

    Linux内核模块的概念和基本的编程方法 标签: Linux内核模块 2013-06-14 18:29 1864人阅读 评论(0) 收藏 举报 分类: linux内核(34) 版权声明:本文为博主原创 ...

  4. linux 删除模块命令,Linux系统中的Modprobe命令:添加和删除Linux内核模块的方法

    在本文中,我们将说明如何使用modprobe命令在Linux内核中添加和删除Linux内核模块.modprobe是kmod的一部分,kmod是一种二进制文件,可实现用于管理Linux内核模块的多个程序 ...

  5. 编写Linux内核模块——第三部分:按键和发光二极管

    [编者的话]了解了基本的内核模块开发.内核空间和用户空间交互之后,终于要开始和硬件设备直接交互了.Linux内核提供了对通用输入输出接口.中断请求等的封装,让驱动开发者可以利用中断来控制硬件线路上的设 ...

  6. Linux内核模块简介

    一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...

  7. 编写Linux内核模块——第一部分:前言

    [编者的话]Linux内核模块作为Linux内核的扩展手段,可以在运行时动态加载和卸载.它是设备和用户应用程序之间的桥梁,可以通过标准系统调用,为应用程序屏蔽设备细节.本文来自Derek Molloy ...

  8. 【Linux驱动】linux内核模块简介

    一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...

  9. 简单了解Linux操作系统中的防火墙软件及其部署案例解析

    1.首先我们来简单的认识一下防火墙: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12 ...

最新文章

  1. android service intent-filter,如何在permission中加入intent-filter过滤器获取NotificationListenerService权限...
  2. 基于消失点的相机自标定(2)
  3. ubuntu 配置dns访问外网
  4. 大数据笔记(三十二)——SparkStreaming集成Kafka与Flume
  5. Macbook 中如何通过命令行打开 vscode
  6. 学习笔记之Java程序设计实用教程
  7. TCP相关的面试内容整理
  8. Java Web学习总结(9)——servlet和Jsp生命周期解读
  9. 601. 体育馆的人流量
  10. Java入门书籍推荐
  11. win7 64位系统PS、AI、PSD缩略图预览补丁
  12. 数据结构:图的基本概念
  13. Triangle程序编译
  14. Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论
  15. 采油工技能鉴定高级工计算机6,采油工技师、高级技师技能鉴定题库(宝典).doc...
  16. JTable深入浅出
  17. Oracle修改内存大小
  18. PHP获取一年有多少天、一个月有多少天(最全最新)
  19. 第 4-2 课:开发一个 Flutter TV 应用
  20. 一枚工程师的深圳印象

热门文章

  1. 视频教程-Tableau从入门到大伽视频教程-大数据
  2. 【苹果推iMessage位置推相册共享推送】软件安装上传到appstore都是需要的Activity
  3. u盘乱码怎么做?这些正确做法你知道吗?
  4. python selenium 安装教程 一看就懂!!!
  5. 吐血力作:平台云deis之安装CoreOS集群
  6. 计算机语言dial,Go语言DialTCP():网络通信【Go语言教程】
  7. vue父组件调用子组件方法
  8. 1361:对角线的数量
  9. oracle 11g 重建索引,oracle数据库如何重建索引
  10. css实现平行四边形等特殊形状 文字图片倾斜