当前课程知识点:Linux 内核分析与应用 > 第1章 概述 > 1.5 动手实践-Linux内核模块的插入和删除 > Video
大家好 我们在之前陈老师的课程中 已经学习了Linux的模块机制
现在我们就来演示一下编写helloworld模块 对它进行插入和删除
在编写Linux内核模块的时候 我们首先要编写自己的.c文件
然后需要编写自己的Makefile文件
之后使用make命令来对自己的.c文件进行编译
生成.ko文件
最后的.ko文件就是我们最后所需要的模块了
我们就是对它进行插入和删除 首先我们来编写自己的.c文件
我们在日常的编程中经常会加入这个(unistd.h)头文件
这个头文件主要是对一些系统调用的
封装
在我们编写Linux内核模块的时候
我们需要添加一个头文件叫做
module.h
这个文件就支持
Linux的模块机制 是我们每次编写内核模块时都要添加的一个头文件
接下来要编写我们的入口函数
我们要加入__init宏
入口函数的名称是我们可以自己指定的
这里我们要在内核的入口函数中打印出helloworld
我们在内核模块的时候不能再使用printf函数
因为内核中并不支持printf函数 要对应的使用printk
printf和printk实际上它们的接口是完全一样的
但是printk可以指定消息的打印级别
一般printk支持八个级别
最低的一个是调试信息 最高的一个是比较重要的信息 可能会使系统崩溃的一些信息
我们可以使用尖括号指定消息打印的级别 我们在这里仅仅使用它的最简单的功能
为了不必要的错误 我们在这里加上一个换行符
接下来编写我们的出口函数
为了能直观地感受到内核模块的删除
我们在这里也打印一行信息
编写完出口函数之后 我们还需要指定一下
入口点用来引导内核写法是这样的
既然是入口点 我们就需要和入口函数保持一致
最后我们还需要声明许可证
在这里使用的是GPL
这就是一个内核模块的大致架构
首先包含module.h头文件用来支持内核的模块机制
接下来要编写入口函数和出口函数
要引导内核入口点 出口点 和许可证的声明
对文件进行保存
接下来我们编写自己的Makefile文件
首先我们需要注意的是Makefile文件
第一个字母一定要大写 这样才能保证在后面的make命令的使用中可以正确的找到Makefile文件进行编译
首先我们写的是
由于刚才的文件定义为helloworld.c
那么对应产生的目标文件就是helloworld.o
这个赋值语句的作用是
要使用目标文件
helloworld.o建立一个模块
那么最后生成的模块对应的名字就是helloworld.ko
接下来为了使我们的Makefile文件有较强的移植性 我们来规定两个路径
和一个内核版本
这里可以采取我们在日常的
shell中使用的方法
wd命令 接下来我们需要
来保存当前内核的代码版本
同样的是在
shell中使用
最后我们要指定内核的路径
我自己系统的内核的路径是在
由于我已经保存了自己的内核版本 那么我这里可以直接使用
接下来是对所有的文件进行编译
那首先要注意的是这里一定是一个Tab键
而不是空格 如果是空格的话是错误的
首先这里要写上内核路径
接下来我们要指定
编译完之后的文件放在哪个目录 在这里就放入当前的目录
最后要写上
modules来表明我们要编译的是内核模块 我们加入clean功能
同样这里也要指定内核的路径
由于我们刚才编译之后的文件都放在了当前目录 那么清空的时候也是要在当前目录来进行的
这就是我们的Makefile文件 这个文件我们可以
放在不同的目录下 只用更改我们的
文件名就可以使用
我们现在已经有了自己的.c文件和Makefile文件
我么直接可以使用make命令来进行编译
我们这里可以看到一个错误就是unistd.h
在内核模块的编写中不能再使用unistd.h这个头文件了
对应的我们要加入一些
init.h头文件
这个头文件主要支持了__init宏和__exit宏
还需要加入
kernel.h
这个就主要包含了一些常用的内核函数
这些.h文件在源代码中都是可以找到的
我自己系统的源代码存在usr文件夹下
这里我需要先使用uname命令
这里就是我自己系统的内核源代码的一些结构
我们所有的Linux中
头文件都包含在include的目录下
我们在这里呢进入include
进入linux
这里就可以看到很多的.h文件 来快速查找一下
是可以找见的 相同的方式我们来找一下kernel.h
这里也是可以找见的
这里也是可以找见的
我们来对文件进行保存
再次使用make命令
我们可以看到编译通过
已经生成了我们需要的.ko文件
但是我们并没有在终端中显示出helloworld
在这里还是要
添加上换行符
在我们编辑错的时候可以使用make clean
之后再次使用make命令来进行编译
之所以这里没有出现helloworld 是因为在内核中
内核模块打交道的方式不再是通过终端 而是要通过
proc目录下
proc是一个虚拟文件系统
它可以用于访问一些有关于内核的状态 进程的信息 我们来进入proc目录来查看一下
我们可以看到有很多的文件
这里每一个数字都代表一个进程所有的信息
而且这里可以找到
meminfo
在这个文件中保存了一些物理内存和交换空间的信息
我们在这里还可以再找到
kmsg
这个就是所有的日志信息了 各种级别的日志信息都包含在这里
那proc文件整体
所有的东西呢他们都可以使用more、less或者是cat命令来进行查看,
那我们这里查看kmsg采用的方式是使用一个命令叫做dmesg
这里我们就可以查看所有的日志信息
好 接下来我们来插入模块
首先插入内核模块需要超级用户权限
使用的命令是insmod
在这里需要加上后缀名.ko
之后可以使用
lsmod命令来查看当前系统中的模块
我们可以看到helloworld模块已经顺利地插入了
接下来就可以使用dmesg命令来打印系统的日志信息
我们可以看到helloworld已经顺利的输出了
接下来对它进行删除 使用时也要超级用户权限
在这里我们只要使用
写上它的模块名称不用再加上后缀名
删除之后来看
已经没有helloworld模块了
那我们现在来再次打印
可以看到正确打印了Goodbye
那这就是一个简单的helloworld模块的插入和删除
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video