使用 /proc 文件系统来访问 Linux 内核的内容
/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux 内核空间和用户空间之间进行通信。在/proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。
?
proc_dir_entry在文件系统中的位置proc_root_fs
/proc
proc_net
/proc/net
proc_bus
/proc/bus
proc_root_driver
/proc/driver
?
回调函数
我们可以使用 write_proc
函数向 /proc 中写入一项。这个函数的原型如下:
int mod_write( struct file *filp, const char __user *buff, unsigned long len, void *data );
filp
参数实际上是一个打开文件结构(我们可以忽略这个参数)。buff
参数是传递给您的字符串数据。缓冲区地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它。len
参数定义了在 buff
中有多少数据要被写入。data
参数是一个指向私有数据的指针(参见 清单 7)。在这个模块中,我们声明了一个这种类型的函数来处理到达的数据。?
读回调函数
我们可以使用 read_proc
函数从一个 /proc 项中读取数据(从内核空间到用户空间)。这个函数的原型如下:
int mod_read( char *page, char **start, off_t off, int count, int *eof, void *data );
page
参数是这些数据写入到的位置,其中 count
定义了可以写入的最大字符数。在返回多页数据(通常一页是 4KB)时,我们需要使用 start
和 off
参数。当所有数据全部写入之后,就需要设置 eof
(文件结束参数)。与 write
类似,data
表示的也是私有数据。此处提供的 page
缓冲区在内核空间中。因此,我们可以直接写入,而不用调用 copy_to_user
。
?