不能直接用 sys_read, sys_open, 因为这些函数没有 export出来。
可以使用 vfs_write, vfs_read.
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
static void read_file(char *filename)
{
// int fd;
char buf[1];
struct file * file;
// loff_t pos = 0;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
file = filp_open(filename, O_RDONLY, 0);
if (file) {
#if 0
while (vfs_read(file, buf, 1, &pos) == 1)
#else
while(file->f_op->read(file, buf, 1, &file->f_pos) == 1)
#endif
{
printk("%c", buf[0]);
}
printk("\n");
filp_close(file, NULL);
}
set_fs(old_fs);
}
static int __init rwfile_init(void)
{
read_file("/etc/group");
return 0;
}
static void __exit rwfile_exit(void)
{ }
MODULE_LICENSE("GPL");
module_init(rwfile_init);
module_exit(rwfile_exit);
makefile文件:
obj-m := rwfile.o
ARCH = arm
CROSS_COMPILE = arm-linux-gnueabi-
all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(HOME)/code/linux-3.10.28 M=$(PWD) modules
clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(HOME)/code/linux-3.10.28 M=$(PWD) clean