Chinaunix
标题:
内核读文件的问题
[打印本页]
作者:
kallytin
时间:
2017-01-04 20:56
标题:
内核读文件的问题
环境:ubuntu16.04,64位系统
代码1:
module_main.c
static int __init test_init(void)
{
........
test_read();
........
}
static void __exit test_exit(void)
{
........
........
}
module_init(test_init);
module_exit(test_exit);
复制代码
代码2:
module_test.c
test_read()
{
char r_buf[10240];
mm_segment_t old_fs;
loff_t pos;
struct file *fp_r = NULL;
for(j=0;j<10240;j++)
{
r_buf[j] = NULL;
}
fp_r = filp_open("file.txt", O_RDONLY,0);
old_fs = get_fs();
set_fs(KERNEL_DS);
pos = 0;
vfs_read(fp_r,r_buf,sizeof(r_buf),&pos);
set_fs(old_fs);
filp_close(fp_r,NULL);
}
复制代码
代码3:
Makefile:
obj-m := test.o
test-objs := module_test.o module_main.o
KDIR := /usr/src/linux-headers-$(shell uname -r)
all: realclean mod clean
mod:
make -C $(KDIR) M=`pwd` modules
realclean:
rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd *.ko
clean:
rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd
install:
sudo insmod test.ko
remove:
sudo rmmod test
复制代码
这时编译是没问题的,make install 也是成功的,即内核读文件是成功的(可以得到准确的文件内容)。
但是,当我打算将“代码2”中的test_read()里的内容做成一个通用函数(infile())的时候,就出问题,具体如下:
代码2(修改,将原来“内核读文件”的代码“移植去”lib.c的infile()函数,这里改为调用infile()以完成“内核读文件”):
module_test.c
test_read()
{
char r_buf[10240];
infile("file.txt", r_buf, 10240);
}
复制代码
代码4(增加一个lib.c文件,里面增加一个函数 infile()):
lib.c
char* infile(char *filename, char *data, int len)
{
mm_segment_t old_fs;
loff_t pos;
struct file *fp_r = NULL;
int j;
for(j=0;j<10240;j++)
{
data[j] = NULL;
}
fp_r = filp_open(filename, O_RDONLY,0);
old_fs = get_fs();
set_fs(KERNEL_DS);
pos = 0;
vfs_read(fp_r,data,sizeof(data),&pos);
set_fs(old_fs);
filp_close(fp_r,NULL);
return data;
}
复制代码
代码3(修改,添加 lib.o):
Makefile:
obj-m := test.o
test-objs := module_test.o module_main.o lib.o
KDIR := /usr/src/linux-headers-$(shell uname -r)
all: realclean mod clean
mod:
make -C $(KDIR) M=`pwd` modules
realclean:
rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd *.ko
clean:
rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd
install:
sudo insmod test.ko
remove:
sudo rmmod test
复制代码
编译是成功的,但当执行 make install 时,整个ubuntu系统崩溃(死机,不响应任何键盘按键),只能按电源键重启。
为何会这样?
作者:
kallytin
时间:
2017-01-05 09:15
有人知道吗?
作者:
wangcong02345
时间:
2017-01-05 10:19
char r_buf[10240]; -->这是要在内核栈上分配10K的内存
但是内核栈只有不到7K,把这个换成kmalloc试试吧。
作者:
Godbach
时间:
2017-01-05 11:52
回复
2#
kallytin
vfs_read(fp_r,data,sizeof(data),&pos);
在你重新封装的函数里, sizeof(data) 应该是多少。
作者:
Godbach
时间:
2017-01-05 11:53
回复
2#
kallytin
应该是 oops 了。你还是把 oops 的信息拍下来的
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2