从Linux内核空间读取文件(模块/驱动程序)(Fedora 14)

从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]

额外的新行可能只是从文件。 但嘿,那正是那个文件里面呢!

看起来写作功能也是如此,如果有人觉得从内核空间写一个文件到一个文件 - 功能就在那里。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏