Heng30的博客
搜索 分类 关于 订阅

如何在Linux驱动中读写文件?

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