在linux系统中,proc文件系统可以用于内核向用户导出信息。proc文件系统是一个虚拟的文件系统,它可以完全有别于IOCTL,实现linux内核空间与应用空间之间的通信。在proc文件系统中,我们可以对虚拟文件的读写作为与内核中实体进行通信的一种手段,与普通文件不同的是,这些文件都是动态创建的。 我们可以通过如下函数在/proc路径下创建节点: - struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
- struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode,struct proc _ dir _ entry *base, read _ proc _ t *read _ proc,void * data);
复制代码create_proc_entry()函数用于创建/proc 节点,而create_proc_read_entry()调用create_proc_entry()创建只读的/proc节点。参数name为/proc节点的名称,parent/base为父目录的节点,如果为NULL,则指/proc目录,read_proc是/proc节点的读函数指针。当read()系统调用在/proc文件系统中执行时,它映像到一个数据产生函数,而不是一个数据获取函数。 下列函数用于创建/proc 目录: - struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);
复制代码如下函数删除/proc节点: - void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
复制代码Linux系统中已经定义好的可使用的/proc节点宏包括:proc_root_fs(/proc)、proc_net (/proc/net)、proc_bus(/proc/bus)、proc_root_driver(/proc/driver)等,proc_root_fs实际就是NULL。 这里通过实例讲述create_proc_read_entry函数的用法。在kernel/drivers/char/x4412目录下新建x4412-read-proc.c文件,编辑内容如下: - #include<linux/init.h>
- #include<linux/module.h>
- #include<linux/kernel.h>
- #include<linux/proc_fs.h>
- #include <asm/uaccess.h>
- static char str[] = "www.9tripod.com";
- ssize_t x4412_proc_read(char *buf, char **start, off_t offset, int count, int *eof, void *data)
- {
- int len = 0;
- len = sprintf(buf, "%s\r\n",str);
- *eof = 1;
- return len;
- }
- static int __init x4412_proc_init(void)
- {
- create_proc_read_entry("x4412-read-proc",0,NULL,x4412_proc_read,NULL);
- printk("x4412_proc Init!\n");
- return 0;
- }
- static void __exit x4412_proc_exit(void)
- {
- remove_proc_entry("x4412-read-proc", NULL);
- printk("x4412_proc Exit!\n");
- }
- module_init(x4412_proc_init);
- module_exit(x4412_proc_exit);
- MODULE_LICENSE("GPL");
复制代码 在程序的开头定义了一个字符串数组str,在初始化函数x4412_proc_init中调用create_proc_read_entry函数在/proc下创建一个名为x4412-read-proc的只读的节点,并关联到读函数x4412_proc_read中,在读函数中通过sprintf函数将字符串数组str打印出来。 在kernel/drivers/char/x4412/Makefile下增加如下语句: - obj-$(CONFIG_X4412_READ_PROC_DRIVER) += x4412-read-proc.o
复制代码 在kernel/drivers/char/x4412/Kconfig下增加如下语句: - config X4412_READ_PROC_DRIVER
- tristate "x4412 read proc driver"
- default m
- help
- compile for x4412 read proc driver,y for kernel,m for module.
复制代码 编译内核,将会在kernel/drivers/char/x4412目录下生成x4412-read-proc.ko文件。加载该ko文件后,可以在/proc目录下看到新建的节点x4412-read-proc,通过cat指令可查看节点的内容,执行界面如下: - insmod /mnt/extsd/x4412-read-proc.ko
- x4412_proc Init!
- root@android:/proc # ls x4412-read-proc
- x4412-read-proc
- root@android:/proc # cat x4412-read-proc
- www.9tripod.com
- root@android:/proc #
- root@android:/proc # echo abc > x4412-read-proc
- 1|root@android:/proc # cat x4412-read-proc
- www.9tripod.com
- root@android:/proc #
复制代码 首先通过insmod 指令加载ko 文件,然后通过ls 指令可以查看到/proc 目录下存在新建的文件节点x4412-read-proc 。通过cat 指令可以查看里面的内容为程序最前面声明的数组内容,即www.9tripod.com。我们尝试通过echo指令给该文件写入数据abc ,再查看文件里面的内容时,发现内容并没有改变,说明该文件只具备读的权限。
|