读书笔记:
第八章:
如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名,参数个数,参数类型和返回值类型,等到a.o和b.o链接成可执行文件或程序时,编译器再到b.o中寻找函数的具体实现,也就是说,extern只在编译阶段起作用;
由于symbol_consumer驱动使用了symbol_producer驱动中导出的符号,因此,在安装symbol_consumer之前,需要先安装symbol_producer,卸载时顺序正好相反;
modprobe命令会根据depmod命令生成的linux模块依赖关系来装载linux模块;
卸载linux驱动:
当卸载函数被阻塞时,rmmod命令也会被阻塞,也就是永远不会执行到卸载linux驱动模块的代码:
(1)引用计数器的值和引用者不一致,实际上引用者是不存在的,因此,只需要将当前的linux驱动模块的引用计数器清零即可;
(2)将原来的卸载函数替换成一个空的卸载函数即可;
上面的两种情况都需要获取表示要卸载的linux驱动模块的module结构体指针,struct module表示了linux驱动的相关信息,从/proc/kallsyms文件中查找系统分配给要卸载的linux驱动的module结构体的首地址,然后将首地址强行转换成module结构体指针。
时间: 2024-10-11 18:21:19