ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

关于内核模块

关于内核模块 目录前言如何制作一个模块模块编译和加载前言我们都知道Linux这种宏内核类型的内核是高度集成的牵一发而动全身我们想在上面修修补补并且调试是非常困难的因为每次修改都要重新编译内核非常费时间而且实际生产中内核中不是所有东西我们都需要为了节省内存往往需要裁剪这时人们便引入模块的概念这里模块就是动态加载模块可执行文件是.ko类型的文件使用时加载不用时卸载让我们的调试非常方便而且模块化的思路也让以后维护系统更加方便。如何制作一个模块那么我们如何才能制作一个模块文件呢首先当然是写源文件了。注意了写在内核里的模块是不能用我们平时的C库的最基本的也是最常用的是linux/init.hlinux/kernel.hlinux/module.h其中第一个记录了__init__exit这样的修饰词具体是为了让代码第一次编译后就释放节约内存第二个有一些内核里面的库函数如printk类似printf但是要自己设置打印等级第三个非常重要就是记录有关初始化和卸载的函数。一般一个模块有以下几个部分头文件模块出入口函数(也就是初始化init和卸载exit)模块出入口注册许可证模块描述和作者信息除了最后两个其他都是必须的我们来看一个例子#includelinux/module.h#includelinux/init.h#includelinux/kernel.h// 入口函数insmod时执行staticint__inithello_init(void){printk(KERN_INFOhello: 模块加载成功\n);return0;}// 出口函数rmmod时执行staticvoid__exithello_exit(void){printk(KERN_INFOhello: 模块卸载成功\n);}// 注册入口、出口module_init(hello_init);module_exit(hello_exit);// 模块信息MODULE_LICENSE(GPL);MODULE_AUTHOR(test);MODULE_DESCRIPTION(A simple linux kernel module demo);模块编译和加载有了c代码但是我们的计算机无法识别C语言所以还需要编译这时候我们需要使用make工具(环境搭建请参考其他博主文章)这时就需要写Makefile文件来指导make工作主要有以下几个部分手动定义内核位置 KERNEL_DIR ../../kernel #定义架构类型 ARCH arm64 #交叉编译工具前缀 CROSS_COMPILE aarch64-linux-gnu- #变量导出 export ARCH CROSS_COMPILE 将.o加载为.ko obj-m : hello.o #all是默认目标即make默认执行项调用内核编译系统编译模块 all: $(MAKE) -C $(KERNEL_DIR) M$(CURDIR) modules #第二个目标make clean触发删除所有中间文件 clean: $(MAKE) -C $(KERNEL_DIR) M$(CURDIR) clean有了这个makefile我们就可以make来编译了后面我们拿着.ko文件需要insmod挂载模块和rmmod卸载模块sudoinsmod helloworld.kodmesg-C#清空日志sudormmod helloworld.kodmesg#通过观察日志来观察模块情况#注意这两个命令都需要管理员权限才能运行即sudo下运行这样就可以根据日志信息调试了后续如果确认无误还可以把模块写进内核镜像或者设置开机自启动都可以这个需要读者自行探索啦。
返回列表