添加内核模块有两种方法:一种是在内核源码里面添加自己的模块文件,以及Makefile和Kconfig,然后重新编译内核使之融入内核;另一种是动态添加,自己写好内核模块并编译,然后使用命令insmod、rmmod动态添加和删除模块。这里我分别讲解两种添加模块的方法。
Makefile与Kconfig
一、手动添加
进入系统的内核源码目录,并创建要添加的模块文件夹
test
|-- cpu
| |-- cpu.c
|
|-- test.c
|-- test_net.c
`-- test_user.c
按照上面的规则创建好目录和要添加的文件之后,我们需要为相应的目录添加Makefiel和Kconfig文件,而新增目录的父目录中的 Kconfig 和 Makefile 文件也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用.
在新增的test目录下,我们应该创建如下的Kconfig文件:
由于 test driver 对于内核来说是新的功能,所以首先需要创建一个菜单 test driver ;然后显示 "test support " ,等待用户选择;接下来判断用户是否选择了 test driver ,如果是 (CONFIG_TEST=y),则进一步显示子功能:用户接口与CPU功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate.为了使这个 Kconfig 文件能起作用,需要修改 drivers/Kconfig 文件,增加以下内容:
脚本中的 source 意味着引用新的 Kconfig 文件.在新增的 test 目录下,应该包含如下 Makefile 文件:
该脚本根据配置变量的取值构建 obj-* 列表.由于 test 目录中包含一个子目录 cpu ,当CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表.test 目录中的 cpu 目录也需包含如下的 Makefile 文件:
为了使得整个 test 目录能够被编译命令作用到, test 目录父目录(即drivers目录)中的 Makefile 文件也需新增如下脚本:
/
增加了Kconfig和Makefile 的test目录结构如下:
test
|-- cpu
| |-- cpu.c
| |-- Kconfig
| `-- Makefile
|-- Kconfig
|-- Makefile
|-- test.c
|-- test_net.c
`-- test_user.c
这样,就添加好了,然后在终端里输入sudo make menuconfig,如果能按照顺序出现一下选项就证明添加成功了。
Device Drivers-->test Driver --->[*]test support,选择y,出现<>test user-space interface (NEW),重新编译内核使之生效。
二、动态添加模块
首先,编写自己的hello.c文件
这个最简单的内核模块只包含内核模块加载函数、卸载函数和对Dual BSSD/GPL许可权限的声明以及一些描述信息。
printf是一个变参函数,它的输出到标准输出设备,即显示器。printf可以到它的头文件里查看。printk输出到日志文件中。
下面通过些Makefile完成该模块的编译以及插入工作。
编写好之后,在终端输入make就可以编译该模块了。产生的hello.ko文件即为模块(这事2.6内核的模块形式),然后通过insmod命令将其加入内核。通过dmesg命令查看是否插入成功
再通过rmmod命令从内核中卸载
同样。我们也可以在日志文件中查看该模块的加载情况/etc/log/syslog文件。
就这么简单,就可实现内核模块的编写以及动态添加和删除了,不过中间的Makefile编写是一个重点,比如中间宏的定义和路径问题一定要准确,要不然会出现各种错误提示,相信大家多练习几遍,能够达到正确默写出.c文件和Makefile就ok了!