kallytin 发表于 2017-01-04 18:49

内核读文件的问题

本帖最后由 kallytin 于 2017-01-04 18:52 编辑

环境: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;

      mm_segment_t old_fs;
      loff_t pos;
      struct file *fp_r = NULL;
      
      for(j=0;j<10240;j++)
      {
                r_buf      = 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;

    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      = 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系统崩溃(死机,不响应任何键盘按键),只能按电源键重启。

为何会这样?

MMMIX 发表于 2017-01-04 20:21

回复 1# kallytin

内核相关的发去内核版吧: http://bbs.chinaunix.net/forum-224-1.html

CrazyBoy_P 发表于 2017-01-05 10:27

char* infile(char *filename, char *data, int len)中sizeof(data)有错,这是对指针取sizeof。应该是len

mournjust 发表于 2017-01-05 13:10

char r_buf;

这么大的局部数组,真的没问题吗?
页: [1]
查看完整版本: 内核读文件的问题