当前位置: 首页 > news >正文

01. 速通Linux内核喂饭版教程

速成版只学 7 个 Part

Part 1:内核模块到底是什么 Part 2:hello.ko 最小模块 Part 3:Makefile 怎么把 .c 编译成 .ko Part 4:insmod / rmmod / lsmod / dmesg 生命周期 Part 5:字符设备:/dev/xxx 是怎么来的 Part 6:mmap:用户态 Worker 怎么读内核数据 Part 7:接回性能监控项目 workflow

先不讲:

Kconfig 静态编译进内核 ARM 交叉编译 模块依赖 EXPORT_SYMBOL 多文件模块

Part 1:内核模块到底是什么

1. 先一句话

Linux 内核模块 = 可以动态插进 Linux 内核里运行的一段代码。

它编译后通常是:

xxx.ko

.ko可以理解为:

Kernel Object

也就是给内核加载的目标文件。


2. 普通程序 vs 内核模块

你平时写的 C/C++ 程序:

main() ↓ 运行在用户态 ↓ 通过系统调用访问内核

比如:

printf("hello\n");malloc(1024);open("/proc/stat",O_RDONLY);

这些都是用户态程序干的。

但内核模块是:

hello.ko ↓ insmod 加载 ↓ 进入内核地址空间 ↓ 运行在内核态 ↓ 可以直接调用内核 API

区别很大:

对比项普通程序内核模块
运行位置用户态内核态
入口main()module_init()注册的函数
打印printfprintk
崩溃影响当前进程崩可能导致系统崩
权限极高
加载方式./a.outinsmod xxx.ko

所以你先记住:

内核模块不是一个普通应用程序,它是被 Linux 内核加载进去执行的代码。


3. 为什么要有内核模块

如果没有内核模块,你想给内核加功能,只能:

修改 Linux 内核源码 ↓ 重新编译整个内核 ↓ 重启机器

太重。

有了内核模块之后:

写 hello.c ↓ 编译成 hello.ko ↓ sudo insmod hello.ko ↓ 模块进入内核 ↓ sudo rmmod hello ↓ 模块卸载

所以它解决的问题是:

不重启、不重新编译整个内核,也能临时扩展内核功能。


4. 加载模块时发生了什么

执行:

sudoinsmod hello.ko

内核大概做这些事:

1. 读取 hello.ko 文件 2. 检查模块格式和内核版本 3. 把模块代码加载到内核地址空间 4. 解析模块依赖的内核符号 5. 调用 module_init 注册的初始化函数

卸载时:

sudormmod hello

内核大概做:

1. 检查模块是否还被使用 2. 调用 module_exit 注册的退出函数 3. 释放模块占用的资源 4. 从内核模块列表中移除

5. 最小内核模块长这样

先看,不要求你现在全懂:

#include<linux/module.h>#include<linux/kernel.h>staticint__inithello_init(void){printk("hello module init\n");return0;}staticvoid__exithello_exit(void){printk("hello module exit\n");}MODULE_LICENSE("GPL");module_init(hello_init);module_exit(hello_exit);

你现在只抓 4 个点:

代码作用
printk内核态打印,日志用dmesg
module_init(hello_init)注册模块加载入口
module_exit(hello_exit)注册模块卸载入口
MODULE_LICENSE("GPL")声明模块许可证

注意:

内核模块没有 main 函数。

它靠:

module_init() module_exit()

告诉内核加载和卸载时该调用哪个函数。


6. 为什么这和性能监控项目有关

你的项目不是为了写 hello 模块,而是为了做这个:

内核模块加载 ↓ 注册字符设备 /dev/xxx ↓ 内核周期性采集 CPU / softirq 累计值 ↓ 把数据写入内核缓冲区 ↓ 用户态 Worker open /dev/xxx ↓ Worker mmap 这块缓冲区 ↓ Worker 读取数据并做差分 ↓ MetricCollector 聚合 ↓ MonitorInfo ↓ gRPC Push 到 Manager

所以面试里你不是说:

我会写 hello world 内核模块。

而是说:

项目里用内核模块把 CPU / softirq 这类高频内核指标暴露给用户态 Worker,Worker 通过字符设备和 mmap 读取,减少频繁 read 和数据拷贝开销。

这才是项目价值。


7. 你现在先背这 6 句

1. Linux 内核模块是可以动态加载进内核运行的一段代码,通常编译成 .ko 文件。 2. 普通程序运行在用户态,内核模块运行在内核态。 3. 内核模块没有 main 函数,加载时执行 module_init 注册的函数,卸载时执行 module_exit 注册的函数。 4. 内核态不能用 printf,要用 printk,日志通过 dmesg 查看。 5. 动态加载用 insmod,查看用 lsmod,卸载用 rmmod。 6. 在性能监控项目里,内核模块主要用于采集 CPU / softirq 等高频指标,并通过字符设备 + mmap 暴露给用户态 Worker。

面试版答案

面试官问:Linux 内核模块是什么?

你直接答:

Linux 内核模块是一种运行时扩展内核功能的机制,编译后通常是.ko文件。它不是普通用户态程序,而是通过insmod加载到内核地址空间执行,通过rmmod卸载。模块没有main函数,而是通过module_init注册加载入口,通过module_exit注册卸载入口。加载时内核会解析模块、完成符号链接,然后调用初始化函数;卸载时调用退出函数释放资源。在我的性能监控项目里,内核模块主要用于采集 CPU 和 softirq 这类高频内核指标,并通过字符设备和mmap暴露给用户态 Worker,减少频繁系统调用和数据拷贝。


http://www.gsyq.cn/news/1592328.html

相关文章:

  • RLHF 与大模型对齐:从 PPO 到 DPO
  • 从零到生产级:VMware上构建PB级大数据平台的8步标准化流程(附自动化部署脚本)
  • 从“词频计数”到“情感势能”——Infoseek舆情系统对12小时预警窗口的重新定义
  • 智慧水利监测系统集成难题破解:多协议 RTU 的多设备兼容与落地实践
  • 外区域拉格朗日平均曲率方程:存在性、渐近行为与函数空间方法
  • 测试工程师如何利用New Relic实现数据驱动的性能监控与瓶颈定位
  • 项目名称:简易全栈博客系统
  • 从Prompt到Agent工作流:大模型客服系统能力升级的三个技术断点
  • 终极指南:如何用Marketch插件5分钟完成Sketch设计稿转HTML代码
  • VMware中搭建Python开发环境:3种主流方案对比+性能压测数据,选错方案=多花200%调试时间
  • 基于Docker与vLLM从零部署AI编程导师DeepTutor实战指南
  • 不会编程如何开发App?适合创业者的AI开发工具推荐
  • LinkSwift网盘直链下载助手:九大平台API解析技术实现与应用指南
  • QuickRecorder终极指南:3分钟掌握macOS专业级录屏
  • Wedecode:微信小程序安全审计与代码还原的技术突破
  • SQPCC算法解析:攻克互补约束的动态优化难题
  • 【计算机毕业设计】高校学籍档案信息管理系统
  • Azure MCP 工具现已内置集成至 Visual Studio 2022,无需额外安装扩展
  • Tomcat Container的管道机制:责任链模式
  • 金融绩效评估新范式:融合谱风险度量与文献计量思想的稳健排名体系
  • 做公开资料整理时,别忽略“失败记录”
  • 3步轻松获取百度网盘真实下载地址:告别限速的终极指南
  • 图论与交换代数的交汇:边理想正则性如何由匹配数决定
  • AI提示词进阶:BROKE框架
  • Ryujinx Nintendo Switch模拟器实战指南:跨平台游戏体验深度解析
  • 专门的 Socket 连接(`ProcessList.mWebViewZygote`)来管理它。
  • 2026多维横评|主流AI编程助手实战对比,国产化开发场景选型必看
  • 用python -m http.server快速搭建一个临时文件共享服务器
  • Windows MySQL5.5 搭建3307多实例从库(避坑完整版)
  • 【IDEA安装避坑指南】:20年Java架构师亲授Windows/macOS/Linux三端零错误安装全流程(附官方镜像校验码)