您的位置:首页 > 运维架构 > Linux

20135218 Linux 实践二 编译模块

2016-05-24 09:12 169 查看
20135218 姬梦馨

1、编写模块代码

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

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

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

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

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

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



3、编译模块

接下来写Makefile。

(其中,all到make的过程中要使用“回车+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操作,输出如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: