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