Linux内核模块编程/proc 文件系统
/proc 文件系统
在linux/' target='_blank' class='infotextkey'>Linux中有额外的机制可以为内核和内核模块将信息发送给进程 -- /proc 文件系统。最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如 /proc/modules 有模块的列表 /proc/meminfo 有内存使用的统计表。
使用proc 文件系统的方法和使用设备驱动程序非常相似--创建一个 /proc 文件需要的所有信息的结构,包括任何处理函数的指针(在我们的例子中只有一个,当某人试图从 /proc 文件读时调用的那一个)。然后,init_module 在内核中登记该结构而cleanup_module 注销它。
我们使用 proc_register_dynamic(这是在 2.0 版中的情况,在 2.2 版中如果我们将节点设置为0系统将自动为我们做到) 的原因是我们不想预先决定我们的文件的节点数字,而是为防止冲突而由内核决定它。通常的文件系统存在于磁盘上而不是内存中(/proc 在内存中),在这中情况下,节点数是是指向文件的索引节点所在的磁盘位置的指针。节点包含文件的信息(例如文件的存取权限)和指向磁盘位置或文件数据可以被找到的几个位置的指针。
因为当文件被打开或关闭的时候不能得到调用,所以在这个模块中没有地方放置 MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT,并且,如果文件被打开随后模块被移除,我们没有办法避免后果。在下一 章我们会看到一个艰难的但更灵活的可以处理/proc文件的实现方式,它也可以让我们防止那个问题。
范例 procfs.c
/* procfs.c - create a "file" in /proc
* Copyright (C) 1998-1999 by Ori Pomerantz
*/
/* 必要的头文件 */
/* 内核模块标准头文件 */
#include/* 内核工作 */
#include/* 明确指定是模块 */
/* 处理CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif
/* 使用proc 文件系统所必要的 */
#include
/* 在 2.2.3 版/usr/include/linux/version.h 中包含这个宏
* 但 2.0.35 版不包含 - 因此我在此加入这个以防需要。 */
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
#endif
/* 将数据放入 proc 文件
在linux/' target='_blank' class='infotextkey'>Linux中有额外的机制可以为内核和内核模块将信息发送给进程 -- /proc 文件系统。最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如 /proc/modules 有模块的列表 /proc/meminfo 有内存使用的统计表。
使用proc 文件系统的方法和使用设备驱动程序非常相似--创建一个 /proc 文件需要的所有信息的结构,包括任何处理函数的指针(在我们的例子中只有一个,当某人试图从 /proc 文件读时调用的那一个)。然后,init_module 在内核中登记该结构而cleanup_module 注销它。
我们使用 proc_register_dynamic(这是在 2.0 版中的情况,在 2.2 版中如果我们将节点设置为0系统将自动为我们做到) 的原因是我们不想预先决定我们的文件的节点数字,而是为防止冲突而由内核决定它。通常的文件系统存在于磁盘上而不是内存中(/proc 在内存中),在这中情况下,节点数是是指向文件的索引节点所在的磁盘位置的指针。节点包含文件的信息(例如文件的存取权限)和指向磁盘位置或文件数据可以被找到的几个位置的指针。
因为当文件被打开或关闭的时候不能得到调用,所以在这个模块中没有地方放置 MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT,并且,如果文件被打开随后模块被移除,我们没有办法避免后果。在下一 章我们会看到一个艰难的但更灵活的可以处理/proc文件的实现方式,它也可以让我们防止那个问题。
范例 procfs.c
/* procfs.c - create a "file" in /proc
* Copyright (C) 1998-1999 by Ori Pomerantz
*/
/* 必要的头文件 */
/* 内核模块标准头文件 */
#include
#include
/* 处理CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif
/* 使用proc 文件系统所必要的 */
#include
/* 在 2.2.3 版/usr/include/linux/version.h 中包含这个宏
* 但 2.0.35 版不包含 - 因此我在此加入这个以防需要。 */
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
#endif
/* 将数据放入 proc 文件



文章评论
共有 位天空网友发表了评论 查看完整内容