Linux Kernel Fundamentals: Chapter 3, Working with Loadable Kernel Modules

在这一章的作业里面,我们创建一个可以加载的模块,做一些可加在模块的实验,创建和使用模块参数。

你需要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()函数,打印出两个参数。

reference:

https://blog.csdn.net/crylearner/article/details/17013187

https://www.cnblogs.com/mylinux/p/5670279.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值