新闻详情

新闻详情

首页 / 资讯中心 / 详情

关于内核模块

发布时间:2026/10/2 7:18:09来源:尧图网络
关于内核模块
目录前言如何制作一个模块模块编译和加载前言我们都知道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下运行这样就可以根据日志信息调试了后续如果确认无误还可以把模块写进内核镜像或者设置开机自启动都可以这个需要读者自行探索啦。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【码动四季·秋】从 commit 到发版全自动:Conventional Commits + semantic-release 发布流水线实战 2026/10/2 17:42:33

【码动四季·秋】从 commit 到发版全自动:Conventional Commits + semantic-release 发布流水线实战

本文为 AtomGit 码动四季开源同行征稿活动参与文章 开源仓库的文件都就位之后,我回头看了一眼 git 历史,发现一个尴尬的事实:仓库里的"版本"只有两个——“刚开始"和"现在”。中间 1287 次提交,没有版本号&am…

阅读更多 →
Spring Boot 3 + LangChain4j 构建AI应用生成平台:微服务全栈实战 2026/10/2 17:42:33

Spring Boot 3 + LangChain4j 构建AI应用生成平台:微服务全栈实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
微信小程序强制更新实战指南:从避坑到无缝升级 2026/10/2 17:42:26

微信小程序强制更新实战指南:从避坑到无缝升级

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AD9026寄存器级API调用:穿透SDK黑盒的物理层开发指南 2026/10/2 17:42:26

AD9026寄存器级API调用:穿透SDK黑盒的物理层开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CAPL不是脚本语言,而是汽车CAN总线的实时神经反射弧 2026/10/2 17:42:26

CAPL不是脚本语言,而是汽车CAN总线的实时神经反射弧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PyCharm警告shadows name:Python作用域与闭包变量遮蔽的排查与解决 2026/10/2 17:42:26

PyCharm警告shadows name:Python作用域与闭包变量遮蔽的排查与解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉