|
详解Linux操作系统设备驱动兼容性(2) MODULE_PARM(io, “1-” __MODULE_STRING(MAX_DEVICES) “i”);
在前一行中,被“字符串化”的值与其他串接在一起构成目标文件中有意义的串。scull示例模块也用MODULE_PARM来声明它的参数(scull_major和其他整数变量)。这在Linux2.0上编译时可能会出问题,那里这个宏未定义。我选择的简单的修正是在sysdep-2.1.h中定义MODULE_PARM,这样在与2.0头文件编译时,它扩展为空语句。其它有意义的值可以象MODULE_AUTHOR()一样 存在模块的.modinfo一节,但它们目前没有使用。请参考以获得更多的信息。
/proc/modules
/proc/modules的格式在2.1.18中略有改变,而所有的模块化代码都被重写了。尽管这个改变并不影响源码,你可能对其细节不感兴趣,因为/proc/modules在模块开发时经常被检查。
新格式和旧的一样是面向行的,每行包含下面的域:
模块名:这个域与Linux2.0相同。
模块大:小这是个十进制数,以字节为单位(而不是内存页)报告长度。这个模块的使用计数如果模块没有使用计数,这个计数报告-1。这是和新的模块化代码一道引入的新特征;你可以写一个模块,它的去除可以有一个函数控制而不是使用计数。这个函数判断模块是否能够被卸载。例如,ipv6模块就使用这个特征。
可选标志 标志是文本串,每个都由括号包含,并由空格分隔。参考本模块的模块列表。这个列表整体被包含在方括号内,表中的单个名字由空格隔开。
下面是/proc/modules在2.1.43中的可能内容:
morgana% cat /proc/modules ipv6 57164 -1 netlink 3180 0 [ipv6] floppy 45960 1 (autoclean) floppy 45960 1 (autoclean) monitor 516 0 (unused)
在这个屏幕快照中,ipv6没有使用计数,并依赖于netlink;floppy已经被kerneld加载,由“autoclean”标志给出,monitor是我的一个小工具,控制一些状态灯,并在系统终止时关掉我的计算机。如你所看到的,它是“unused”,我并不关心它的使用计数。
文件操作
有几个文件操作在2.1里与2.0有不同的原型。这主要是出于处理大小不能放入32位的文件的需要。其不同由头文件sysdep-2.1.h处理,它根据使用的核心版本定义了几个伪类型。文件操作中引入的仅有的显著创新是poll方法,它用完全不同的实现代替了select方法。
原型的不同
四个文件操作表征一个新的原型;它们是:
long long (*llseek) (strUCt inode *, struct file *, long long, int);
|