从Linux内核空间读取文件(模块/驱动程序)(Fedora 14)
看起来像与用户空间通信的操作真的是不鼓励的。 我不是在争论 虽然并不意味着他们无法实现。 驱动程序加载只能存储在HDD上的配置。 当MS Windows XP启动时,它会记住我已经关闭蓝牙,因此它没有打开电源,不同于即使是最新的Linux(Fedora 14在写作时),许多驱动程序中的功能都没有实现。 当开发人员使用procfs或字符设备时,应该有另一个启动顺序中的软件或脚本,其实际上是将信息从文件发送到特定设备。
经过一段时间看过互联网,我已经设法写了一个读取文件的模块。 这里呢
#include <linux/module.h> // Needed by all modules #include <linux/kernel.h> // Needed for KERN_INFO #include <linux/fs.h> // Needed by filp #include <asm/uaccess.h> // Needed by segment descriptors int init_module(void) { // Create variables struct file *f; char buf[128]; mm_segment_t fs; int i; // Init the buffer with 0 for(i=0;i<128;i++) buf[i] = 0; // To see in /var/log/messages that the module is operating printk(KERN_INFO "My module is loaded\n"); // I am using Fedora and for the test I have chosen following file // Obviously it is much smaller than the 128 bytes, but hell with it =) f = filp_open("/etc/fedora-release", O_RDONLY, 0); if(f == NULL) printk(KERN_ALERT "filp_open error!!.\n"); else{ // Get current segment descriptor fs = get_fs(); // Set segment descriptor associated to kernel space set_fs(get_ds()); // Read the file f->f_op->read(f, buf, 128, &f->f_pos); // Restore segment descriptor set_fs(fs); // See what we read from file printk(KERN_INFO "buf:%s\n",buf); } filp_close(f,NULL); return 0; } void cleanup_module(void) { printk(KERN_INFO "My module is unloaded\n"); }
这就是读取/ etc / fedora-release
文件所需要的。 为了防万一,如果源被保存为module.c
,则需要在Makefile中
:
obj-m += module.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
发行如下:
$ make
$ su
# insmod module.ko
然后在/ var / log / messages
的末尾我看到如下:
Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] My module is loaded
Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:Fedora release 14 (Laughlin)
Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]
额外的新行可能只是从文件。 但嘿,那正是那个文件里面呢!
看起来写作功能也是如此,如果有人觉得从内核空间写一个文件到一个文件 - 功能就在那里。