如何编译第一个模块 hello.ko.txt
在深入探讨如何编译第一个Linux内核模块hello.ko.txt之前,我们首先应当明确几个关键概念:Linux内核模块、Makefile以及相关的编程语言和工具。Linux内核模块是能够被动态加载到运行中的内核的独立代码块,用于扩展内核的功能而无需重启系统。Makefile则是一种用于自动化构建过程的脚本文件,它可以指定如何编译源代码并生成可执行文件或库。 ### Linux内核模块编译流程 #### 1. 源代码准备 在给定的部分内容中,我们看到了一个简单的Linux内核模块源代码示例mymod.c。该模块包含了以下关键元素: - **头文件**:通过`#include`指令导入必要的内核模块开发头文件,如`<linux/module.h>`,`<linux/init.h>`等。 - **模块初始化与退出函数**:`yuer_init`和`yuer_exit`分别作为模块加载和卸载时调用的函数。 - **模块参数**:通过`module_param()`定义模块参数`nbr`,允许用户在加载模块时动态设定。 - **模块元数据**:如作者信息`MODULE_AUTHOR`和许可证类型`MODULE_LICENSE`。 #### 2. Makefile配置 接下来是Makefile的编写,它是编译内核模块的关键。在这个过程中,Makefile定义了模块的目标对象文件(`obj-m`)、依赖的源文件(`modules-objs`)以及编译环境(`KDIR`, `PWD`)。具体步骤如下: - `obj-m`变量指定了要编译的模块名称。 - `modules-objs`列出了模块所需的源文件。 - `KDIR`指向内核源代码目录,这是构建模块所必需的。 - `PWD`表示当前工作目录,即Makefile所在位置。 - `default`规则定义了默认目标,即编译操作。 - `clean`规则用于清理编译产生的临时文件。 #### 3. 编译模块 有了正确的源代码和Makefile配置后,就可以使用`make`命令进行编译。在Makefile所在目录下运行`make`,Makefile会自动调用内核编译工具链完成模块的编译,最终生成`.ko`格式的可加载模块文件。 #### 4. 加载与测试模块 编译成功后,使用`sudo insmod <模块名>.ko`命令将模块加载到内核中。接着,可以利用`dmesg`命令查看内核日志,确认模块是否正确加载及输出预期的信息。 ### 实战案例分析 根据给定的代码片段,我们可以看到模块加载时会打印出一系列问候信息,这些信息来源于`yuer_init`函数中的`printk`调用。这不仅验证了模块加载的成功,也展示了如何通过模块参数控制模块的行为。 ### 总结 编译Linux内核模块是一项涉及源代码编写、Makefile配置、编译工具链使用以及模块加载测试的综合技能。掌握这一技能不仅对于Linux系统开发者至关重要,也对任何希望深入了解操作系统内部机制的学习者具有极大的价值。通过实践上述步骤,你将能够独立创建并管理自己的内核模块,从而在Linux系统开发领域迈出坚实的一步。
本文将直接了当的带你进入linux的模块编译。当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂。之所以要写这篇文章,主要是因为从书本上学的话,可能要花更长的时间才能学会整个过程,因为看书的话是一个学习过程,而我这篇文章更像是一个培训。所以实践性和总结性更强。通过本文你将会学到编译一个模块和模块makefile的基本知识。以及加载(卸载)模块,查看系统消息的一些知识;
声明:本文为初学者所写,如果你已经是一个linux模块编译高手,还请指正我文章中的错误和不足,谢谢
第一步:准备源代码
首先我们还是要来编写一个符合linux格式的模块文件,这样我们才能开始我们的模块编译。假设我们有一个源文件mymod.c。它的源码如下:
mymodules.c
1. #include <linux/module.h> /* 引入与模块相关的宏 */
2. #include <linux/init.h> /* 引入module_init() module_exit()函数 */
3. #include <linux/moduleparam.h> /* 引入module_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. module_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; i<nbr; i++)
15. {
16. printk(KERN_ALERT "Hello, How are you. %d\n", i);
17. }
18. return 0;
19.}
20.
22.{
23. printk(KERN_ALERT"I come from yuer's module, I have been unlad.\n");
24.}
25.
26. module_init(yuer_init);
27. module_exit(yuer_exit);
我们的源文件就准备的差不多了,这就是一个linux下的模块的基本结构。第9行是导出我们的符号变量nbr。这样在你加载这个模块的时候可以动态修改这个变量的值。稍后将演示。yuer_init()函数将在模块加载的时候运行,通过输出的结果可以看到我们的模块是否加载成功。
第二步:编写Makefile文件
首先还是来看看我们Makefile的源文件,然后我们再来解释;
Makefile
obj-m := modules.o #要生成的模块名
modules-objs:= mymod.o #生成这个模块名所需要的目标文件
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
现在我来说明一下这个Makefile。请记住是大写的Makefile而不是小写的makefile;
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助