20135218 Linux 实践二 编译模块

 

20135218 姬梦馨

1、编写模块代码

模块构造函数:执行insmodmodprobe指令加载内核模块时会调用的初始化函数。函数原型必须是module_init()括号内是函数指针

模块析构函数:执行rmmod指令卸载模块时调用的函数。函数原型是module_exit()

头文件module.h,必须包含此文件;

头文件kernel.h,包含常用的内核函数;

头文件init.h包含宏_init_exit,允许释放内核占用的内存。

写一个简单的代码,用来向内核输出一段文字。

 

3、编译模块

接下来写Makefile

(其中,allmake的过程中要使用“回车+Tab”键)

第一行:自己写的.c的文件名+”.o”。

第三行的LINUX_KERNEL_PATH后面要写你自己的内核版本对应的内核源码包地址.

解释一下make命令:

make -C $(LINUX_+KERNEL_PATH) 指明跳转到内核源码目录下读取那里的Makefile

M=$(CURRENT_PATH) 表明返回到当前目录继续执行当前的Makefile

代码很简单,其中 LINUX_KERNEL_PATH  包含了自己的虚拟机的内核地址。

使用 make命令 来编译。要使用tab 补全,不然写好的代码不能用。

 

make之后的执行时这样的

 

生成了好多文件:

 

4加载模块

sudo insmod 1.ko

输入密码后即可。此时已经加载了模块。

5、测试模块

Dmesg:看内核信息

6卸载模块

sudo rmmod 1

这时用dmesg看内核信息,就会看到写在module_exit()中的输出。

 

7、实现输出当前进程信息的功能

1:代码

Makefile如下:

之后make

sudo insmod 2.ko

 

Dmesg:看内核信息。

实现了代码的功能,验证成功。

 

8、实现读取进程链表的功能

在上一个代码的基础上,修改代码。

可以看到,我用了一个叫做for_each_process()的宏,它的定义如下:

其实就是个for循环,从第一个PCB(叫做init_task)开始,顺着next指针读了一圈。

修改Makefile,进行make,insmod操作,输出如下:

 

posted @ 2016-05-24 09:12  偷影子的人  阅读(161)  评论(0编辑  收藏  举报