<span style="font-family: 'Microsoft YaHei', sans-serif; font-size: 16px;">
-
__init,__exit作用:
- __init:告诉编译器将该函数放入一个特殊的内存区域,在驱动初始化完成后,自动释放该函数占用的内存。
- __exit:如果驱动被直接编译进内核内核(Built-in),由于它永远不可能被卸载,
__exit修饰的函数甚至根本不会被编译进内核映像,从而直接省下了这部分代码的存储空间。如果编译成模块(.ko),则正常保留直到卸载时执行。
-
make命令中M参数作用:
-
-C令下达:make进程先跳转到内核源码目录/root/project/linux。 -
读取内核主配置:加载内核的核心编译规则、确定平台架构(如 ARM)、准备好符号表。
-
识别 M 参数:内核 Makefile 检测到命令行里有
M=...。它立刻意识到:"这不是要编译内核自带的驱动,而是要帮别人编译外部独立驱动。" -
控制权转移:内核编译系统带着所有的编译工具链、内核头文件和特权,回过头来进入
M指定的路径(即你的驱动目录)。 -
加工并就地输出:在你的驱动目录下找到
Makefile和hello_drv.c,在原地编译出hello_drv.o,并最终链接生成hello_drv.ko。
-
-
make命令中的modules作用:
modules的作用是指定内核编译系统的"构建目标(Target)" 。因为内核源码支持编译很多种东西,比如:
-
编译内核核心镜像(
zImage/vmlinux) -
编译架构相关的文件(
dtbs设备树) -
编译外部驱动模块(
modules)不同的编译目标,内核会引入不同的头文件依赖、宏定义和平台规则。当你加上
modules关键字后,内核就会明确知道:"哦,这个用户之前是用modules目标编译的外部驱动。现在我要套用外部驱动模块的上下文环境和清理规则,生成目标。
-
-
register_chrdev作用:仅仅是在内核里登记了名字和主设备号 ,它不会自动在/dev/目录下创建文件。 -
class_create和device_create的作用:-
class_create:在/sys/class/下创建分类目录。 -
device_create:在分类目录下创建设备子目录,并写入带有主次设备号的dev文件。 -
/dev/xxxx节点 :由应用层的mdev/udev监测到/sys的变化后,在/dev/目录下自动生成。
-
-
/proc和/sys虚拟文件路径区别:
-
/proc偏向"软件与状态": 负责展示系统当前运行的软件生态(进程、内存消耗、网络连接、内核全局配置)。 -
/sys偏向"硬件与结构": 负责展示系统当前连接的物理世界(总线、芯片、设备类别、电源管理、拓扑树)。
-
</span>