`
zhangjia328
  • 浏览: 17970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

模块编程_2.4内核_redhat9

阅读更多

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扩展为内核版本的二进制表示版本发行号的每一个部分对应一个字节。13211616进制表示为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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics