正点原子RK3568学习日志7-module_init优先级
1.module_init(helloworld)宏定义模块的入口函数
相关设备驱动程序:module_init
->__define_initcall(fn, 6)
kernel\include\linux\init.h id值越大执行就越晚,数字越小,优先级越高,带s段的优先级要小于不带 "s" 段的优先级
先module_init(helloworld),
/home/alientek/rk3568_linux5.10_sdk/kernel/include/linux module.h
是一个条件编译
#ifndef
没有定义执行
#else
定义了执行
#endif
2.链接脚本(linker script)中定义初始化调用函数的布局和顺序
_initcall0_start等以_start结尾的相关变量记录了.initcall0.init等段的首地址,这些变量在 init/main.c中通过extern关键字进行引用,并将这些首地址放置在数组initcall_levels中,具
在使用module_init(hello_world)时,hello_world()函数指针会被放置在.initcall6.init段处。内核启动时,会执行do_initcall()函数,该函数根据指针数组initcall_levels[6]找到_initcall6_start,在include/asm-generic/vmlinux.lds.h文件中可以查到_initcall6_start对应.initcall6.init段的起始地址。然后,依次取出该段中的函数指针,并执行这些函数。
3.实验:hellworld_A.c 比helloworld_B.c早编译
“include/linux/module.h
改接口函数就行,A用优先级高的接口函数,B用低的就好
1.使用驱动直接编译到内核
2.将helloworld_A.c和helloworld_B.c文件放在同一目录,目录需要放在字符设备目录下
3.改Kconfig,然后与上级联系
4.改Makefile,还是使用图形化界面,然后与上级联系,-objs: 这是一个固定的后缀,意思是“...的目标文件列表”。
5.Kernle的.config更改
6.SDK目录, ./build.sh kernel 进行编译,boot.img文件然后烧录到rk3568板子
验证
dmesg | grep "hello" 查看日志
4.问题:
1.vim下 /查找 n向下
2.预处理器会将所有以\ ``连接的行合并为一行
3.__PASTE宏 这个宏是一个编译时的字符串/标识符生成器。要实现“拼接”,核心是 __PASTE宏
5.注意:##代表强制连接,#表示对这个变量替换后,用双引号引起来