《LINUX驱动程序设计》学习笔记 ——04

发布时间 2023-09-18 12:30:52作者: 成信吴彦祖(略胜亿筹)

1. 模块的装载竞争(竞态)

  竞态是驱动程序设计极其重要的方面,始终要铭记:在注册完成后,内核的某些部分可能会立即使用我们刚刚注册的任何设施。换句话说,在初始化函数还在运行的时候,内核就完全可能会调用我们的模块。因此,在首次注册完成后,代码就应该准备好被内核其他部分调用;在用来支持某个设施的所有内部初始化完成之前,不要注册任何设施。

  同时可能出现初始化失败,但是内核的某些部分已经使用了模块所注册的某个设施时的情况。理论上既然已经使用了注册的某个设施,不应该出现初始化失败的情况,毕竟模块已经成功导出了可用的功能及符号。这种情况暂时按下不表,后续深入学习。

2. 模块参数

  insmod和modprobe在装载模块时可以赋值参数,并且modprobe还能从指定文件中读取参数。驱动程序中通过module_param宏来声明参数,例如:

static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

/* module_param 宏的最后一个参数为成员访问许可证
* 其中S_IRUGO表示所有用户均可读取参数,但不能修改参数。
* S_IRUGO | S_IWUSR 表示允许root用户修改该参数。
* 在严谨的情况下,我们不允许参数可写,此处按住不表,因为涉及到修改sysfs而使参数被修改,并且不予通知的情况。目前内核是否对此做了修改需要查证。
*/

  当参数涉及到数组时,也有特定的宏 module_param_arry,具体不细表。