在这一章的作业里面,我们创建一个可以加载的模块,做一些可加在模块的实验,创建和使用模块参数。
你需要root权限。
你需要安装Linux kernel开发包。在Ubuntu上面,一般在linux-headers-$(uname -r)。有一个连接到这个kernel目录(里面有Makefile子目录等等),叫做/lib/modules/$(uname -r)/build。如果build不存在或者是一个坏的链接,那么你需要自己安装。
我们写kernel代码,糟糕的事情可能发生。所以最好在虚拟机里面做作业。
1. 创建一个可加载的模块。在一个空的目录下面。
a. 创建一个叫做lab.c的文件。添加预处理器命令包含两个头文件:linux/module.h和linux/init.h
b. 添加一个叫做my_init_module()的函数。这个函数不应该有参数并且返回int。这个函数应该用printk打印一个消息。my_init_module()应该返回0。用module_init()注册这个函数。
c. 创建一个叫做my_cleanup_module()的函数。这个函数没有参数也没有返回值。它用printk打印一个消息。然后用module_exit()函数注册它。
d. 在文档最后添加一行模块证书行,MODULE_LICENSE("GPL")。
e. 创建一个makefile来制作lab.ko。
f. 用make将你的模块编译成.ko。
g. 用insmod命令加载你的模块,用sudo。
h. 你看到什么打印了吗?你应该用dmesg看一看。
i. 运行lsmod,你看到你的模块了吗?
j. 使用rmmod来unload你的模块,你从dmesg的输出中看到了什么消息呢?
k. 再次运行lsmod,你还看到你的模块吗?
2. 关于init_module()函数的参数的实验。
a. 编辑你的模块并改变init_module()的返回值,从0到-1.
b. 编译模块,重新加载这个模块看到什么错误了吗?
c. 你的模块从lsmod中输出了吗?
d. 试着rmmod会发生什么?
e. my_cleanup_module会被调用吗?
3. 关于嵌入文档的实验
a. 修改你的模块来包含作者和模块描述。
b. 重新编译你的模块,然后运行modinfo并带有-d和-a选项。
4. 添加一下可修改的参数
a. 编辑你的模块,添加一个static int参数和一个static char*参数。初始化static int为一个整数,初始化static char*为一个字符串。
b. 使用module_param()宏来定义。
c. 编辑模块,使用MODULE_PARM_DESC()对这两个参数进行描述。
e. 重新编译。运行modinfo -p。
f. 编辑init_module()函数,打印出两个参数。