使用 /proc 文件系统来访问Linux内核的内容

2014-02-27 11:34:13Linux媛媛

清单 5. 插入、检查和删除 LKM

[root@plato]# insmod simple-lkm.ko [root@plato]# lsmod Module Size Used by

simple_lkm 1536 0

autofs4 26244 0

video 13956 0

button 5264 0

battery 7684 0

ac 3716 0

yenta_socket 18952 3

rsrc_nonstatic 9472 1 yenta_socket

uhci_hcd 32144 0

i2c_piix4 7824 0

dm_mod 56468 3

[root@plato]# rmmod simple-lkm [root@plato]#

注意,内核的输出进到了内核回环缓冲区中,而不是打印到 stdout 上,这是因为 stdout 是进程特有的环境。要查看内核回环缓冲区中的消息,可以使用 dmesg 工具(或者通过 /proc 本身使用 cat /proc/kmsg 命令)。清单 6 给出了 dmesg 显示的最后几条消息。

清单 6. 查看来自 LKM 的内核输出

[root@plato]# dmesg | tail -5 cs: IO port probe 0xa00-0xaff: clean.

eth0: Link is down

eth0: Link is up, running at 100Mbit half-duplex

my_module_init called. Module is now loaded.

my_module_cleanup called. Module is now unloaded.

[root@plato]#

可以在内核输出中看到这个模块的消息。现在让我们暂时离开这个简单的例子,来看几个可以用来开发有用 LKM 的内核 API。

集成到 /proc 文件系统中

内核程序员可以使用的标准 API,LKM 程序员也可以使用。LKM 甚至可以导出内核使用的新变量和函数。有关 API 的完整介绍已经超出了本文的范围,因此我们在这里只是简单地介绍后面在展示一个更有用的 LKM 时所使用的几个元素。

创建并删除 /proc 项

要在 /proc 文件系统中创建一个虚拟文件,请使用 create_proc_entry 函数。这个函数可以接收一个文件名、一组权限和这个文件在 /proc 文件系统中出现的位置。create_proc_entry 的返回值是一个 proc_dir_entry 指针(或者为 NULL,说明在 create 时发生了错误)。然后就可以使用这个返回的指针来配置这个虚拟文件的其他参数,例如在对该文件执行读操作时应该调用的函数。create_proc_entry 的原型和 proc_dir_entry 结构中的一部分如清单 7 所示。

清单 7. 用来管理 /proc 文件系统项的元素

struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,

struct proc_dir_entry *parent );

struct proc_dir_entry {

const char *name; // virtual file name

mode_t mode; // mode permissions

uid_t uid; // File‘s user id

gid_t gid; // File’s group id

struct inode_operations *proc_iops; // Inode operations functions

struct file_operations *proc_fops; // File operations functions

struct proc_dir_entry *parent; // Parent directory

。..

read_proc_t *read_proc; // /proc read function

write_proc_t *write_proc; // /proc write function

void *data; // Pointer to private data

atomic_t count; // use count

。..

};

void remove_proc_entry( const char *name, struct proc_dir_entry *parent );

稍后我们就可以看到如何使用 read_proc 和 write_proc 命令来插入对这个虚拟文件进行读写的函数。

要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数。要使用这个函数,我们需要提供文件名字符串,以及这个文件在 /proc 文件系统中的位置(parent)。这个函数原型如清单 7 所示。

parent 参数可以为 NULL(表示 /proc 根目录),也可以是很多其他值,这取决于我们希望将这个文件放到什么地方。表 1 列出了可以使用的其他一些父 proc_dir_entry,以及它们在这个文件系统中的位置。

表 1. proc_dir_entry 快捷变量

proc_dir_entry 在文件系统中的位置

proc_root_fs /proc

proc_net /proc/net

proc_bus /proc/bus

proc_root_driver /proc/driver

回调函数

相关教程
图文教程