2025-03-16
一般来说,驱动是不会访问文件系统的,更不会在文件系统上创建除设备驱动文件外的其他文件。但是有时为了满足某些奇怪的需求,会有访问文件系统的需求。下面就用一个小例子,演示如何在文件系统上创建文件,并读写数据?
// simple.c
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/module.h>
static int __init simple_init(void) {
    struct file *file;
    char data[128] = "hello world";
    ssize_t len;
    pr_info("simple_init\n");
    file = filp_open("/tmp/hw.tmp", O_RDWR | O_CREAT, 0644);
    if (!file) {
        pr_err("file_open /tmp/hw.tmp error\n");
        return -1;
    }
    len = kernel_write(file, data, sizeof(data), &file->f_pos);
    if (len < 0) {
        pr_err("kernel_write /tmp/hw.tmp error\n");
        filp_close(file, NULL);
        return -1;
    }
    memset(data, 0, 128);
    file->f_pos = 0;
    len = kernel_read(file, data, sizeof(data), &file->f_pos);
    if (len < 0) {
        pr_err("kernel_read /tmp/hw.tmp error\n");
        filp_close(file, NULL);
        return -1;
    }
    filp_close(file, NULL);
    pr_info("read from /tmp/hw.tmp: '%s'\n", data);
    return 0;
}
static void __exit simple_exit(void) { pr_info("simple_exit\n"); }
module_init(simple_init);
module_exit(simple_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("heng30");
MODULE_VERSION("v0.0.1");
MODULE_DESCRIPTION("A simple kernel module");
#!/bin/sh
top-dir = $(shell pwd)
kernel-version = $(shell uname -r)
kernel-dir ?= /lib/modules/$(kernel-version)/build
obj-m += simple.o
all:
        make -C $(kernel-dir) modules M=$(top-dir)
clean:
        rm -f *.o *.ko *.mod *.mod.c *.order *.symvers *.dtbo
        make -C $(kernel-dir) clean m=$(top-dir)
编译程序:make
安装驱动:insmod simple.ko
查看输出:dmesg
[61128.670909] simple_init
[61128.671049] read from /tmp/hw.tmp: 'hello world'
[61313.782660] simple_exit
rmmod simple.ko