Linux实践二--模块

一、知识点总结

①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。之所以提供模块机制,是因为Linux本身是一个单内核。单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷。
②Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。
③一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表中,以便模块间的通信。

二、具体实践

1.简单实现

#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static char *name =" fyj";
static int __init name_init(void)
{
printk("==hello,world==\n");
printk("==hello,%s\n",name);
return 0;
}
static void __exit name_exit(void)
{
printk(KERN_INFO"name module exit\n");
} module_init(name_init);
module_exit(name_exit); module_param(name,charp,S_IRUGO);

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

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

②模块许可声明:函数原型是MODULE_LICENSE(),告诉内核该程序使用的许可证,不然在加载时它会提示该模块污染内核。一般会写GPL。

头文件module.h,必须包含此文件;
头文件kernel.h,包含常用的内核函数;
头文件init.h包含宏_init和_exit,允许释放内核占用的内存。

接下来写Makefile。

第一行:自己写的.c的文件名+”.o”。
第三行的LINUX_KERNEL_PATH后面要写你自己的内核版本对应的内核源码包地址.
解释一下make命令:
make -C $(LINUX_KERNEL_PATH) 指明跳转到内核源码目录下读取那里的Makefile
M=$(CURRENT_PATH) 表明返回到当前目录继续执行当前的Makefile。

输入make进行自动编译



输入sudo insmod lwr.ko,加载模块(会要求输入当前用户的密码),再输入dmesg,测试模块输出



最后,输入sudo rmmod fyj卸载之后,就将内核中之前加载的模块删除,这时用dmesg看内核信息,就会看到写在module_exit()中的输出。

2.内核模块的功能实现

在上述步骤的基础上,可以对内核模块的.c文件进行修改以实现更多的功能



for_each_process()的函数本质即for循环,从第一个PCB(init_task)开始,顺着pcurrent链表进行遍历,输出所有当前进程的信息(pid,tgid等)。

Makefile编写如下



进行make之后,顺利生成模块,再进行sudo insmod lwr.ko,之后dmesg,就可以查看进程链表的信息

三、总结

本周按照老师的要求,做了一个空的模块之后,再做一个系统调用或者遍历。实验过程中较为顺利,没有很大的困难。但是应该更加注重代码的实际理解和运用。

最新文章

  1. 微信小程序之知乎日报
  2. 【SQL】小心字符串拼接导致长度爆表
  3. DataTable 除去列中重复值
  4. Android &amp; iOS 第三方 Crash ANR 捕捉上传
  5. java日期比较,日期计算
  6. CRUD Operations in MVC4 Using AngularJS and WCF REST Services
  7. java截取字符串中的数字
  8. javascript 中函数eval()
  9. 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射
  10. Windows 下音频数据采集和播放
  11. Qt 学习之路:二进制文件读写
  12. [饭后算法系列] &quot;头尾移动&quot; 排序列表
  13. two sets of Qt binaries into the same process的解决办法
  14. 【Stackoverflow好问题】祛烦“!=null&amp;quot;()判处空语句
  15. 【转】Netty系列之Netty是什么
  16. 从源码(编译)安装golang 二
  17. Git让你从入门到精通,看这一篇就够了
  18. laravel整合vue 多入口解决
  19. nginx域名跳转到www下
  20. Leetcode 345. 反转字符串中的元音字母 By Python

热门文章

  1. 1.2 Spyder的基本使用
  2. Django之ORM查询进阶
  3. 用Python读写Excel文件的方式比较
  4. BZOJ1041:[HAOI2008]圆上的整点(数论)
  5. iframe获取父、子窗口的元素和方法
  6. 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)
  7. node中npm安装模块的网络问题
  8. Android学习之基础知识四-Activity活动8讲(活动的灵活运用)
  9. Android 动态的给Button、TextView、ImageView等控件设置了background后,再设置padding属性时该属性不起作用
  10. 新页面,简单的tree视图写法