1. include/linux/config.h
include/linux/module.h中包含着linux/config.h的头文件,linux/config.h中包含着以#define形式定义的内核编译编译时所选择的项。
2. __init 和 __exit
在将程序编译为模块时(即gcc 编译选项了加了 _DMODULE),这两个内核宏不被识别,从而导致编译出错。
3. 驱动程序中的ioctl()的command
在 redhat 9 (kernel 2.4.20-8)中,include/asm-i386/ioctl.h中有如下定义:
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
#define _IOC_SIZEBITS 14
#define _IOC_DIRBITS 2
由此可见,整个ioctl() 的 command 的长度为 32 bits,各个字段的长度如上所示。
知道了这些,那些同样在include/asm-i386/ioctl.h中定义的用来构造和解析ioctl()的command的宏也就很好理解了。
4. include/linux/version.h
include/linux/version.h包含在include/linux/module.h中。在include/linux/version.h内容如下:
#include <linux/rhconfig.h>
#if defined(__module__smp)
#define UTS_RELEASE "2.4.20-8smp"
#elif defined(__module__BOOT)
#define UTS_RELEASE "2.4.20-8BOOT"
#elif defined(__module__bigmem)
#define UTS_RELEASE "2.4.20-8bigmem"
#else
#define UTS_RELEASE "2.4.20-8"
#endif
#define LINUX_VERSION_CODE 132116
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
其中,宏LINUX_VERSION_CODE扩展为内核版本的二进制表示,版本发行号的每一个部分对应一个字节。132116的16进制表示为0x020416,点分十进制即为:2.4.20.
宏 KERNEL_VERSION 以组成版本号的三部分(三个整数)为参数,创建“kernel_version_code”。
5. 模块使用计数
linux/module.h 中定义的关于模块使用技术的宏:
MOD_INC_USE_COUNT
MOD_DEC_USE_COUNT
MOD_IN_USE : 计数非0时返回真。
6. kdev_t
现在 Linux 内核使用 kdev_t 类型保存设备号。kdev_t 的相关信息在 <linux/kdev_t.h>中定义。对 kdev_t进行操作的宏以及函数如下:
MAJOR(kdev_t dev) : 从 kdev_t 结构中得出主设备号。
MINOR(kdev_t dev): 从kdev_t结构中得出次设备号。
MKDEV(int ma, int mi) : 通过主设备号和次设备号创建 kdev_t。