免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2073 | 回复: 3
打印 上一主题 下一主题

[C] 内核读文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-04 18:49 |只看该作者 |倒序浏览
本帖最后由 kallytin 于 2017-01-04 18:52 编辑

环境:ubuntu16.04,64位系统

  1. 代码1:
  2. module_main.c

  3. static int __init test_init(void)  
  4. {
  5.         ........
  6.         test_read();
  7.         ........
  8. }

  9. static void __exit test_exit(void)  
  10. {
  11.         ........
  12.         ........  
  13. }  
  14.   
  15. module_init(test_init);  
  16. module_exit(test_exit);  
复制代码
  1. 代码2:
  2. module_test.c

  3. test_read()
  4. {
  5.         char r_buf[10240];

  6.         mm_segment_t old_fs;
  7.         loff_t pos;
  8.         struct file *fp_r = NULL;
  9.         
  10.         for(j=0;j<10240;j++)
  11.         {
  12.                 r_buf[j]        = NULL;
  13.         }


  14.         fp_r = filp_open("file.txt", O_RDONLY,0);        
  15.                
  16.         old_fs        = get_fs();
  17.           set_fs(KERNEL_DS);  
  18.           pos        = 0;
  19.         vfs_read(fp_r,r_buf,sizeof(r_buf),&pos);
  20.         set_fs(old_fs);

  21.         filp_close(fp_r,NULL);
  22. }
复制代码
  1. 代码3:
  2. Makefile:

  3. obj-m := test.o
  4. test-objs         := module_test.o module_main.o

  5. KDIR                 := /usr/src/linux-headers-$(shell uname -r)

  6. all:        realclean mod clean

  7. mod:
  8.         make -C $(KDIR) M=`pwd` modules

  9. realclean:
  10.         rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd *.ko

  11. clean:
  12.         rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd

  13. install:
  14.         sudo insmod test.ko

  15. remove:
  16.         sudo rmmod test
复制代码

这时编译是没问题的,make install 也是成功的,即内核读文件是成功的(可以得到准确的文件内容)。

但是,当我打算将“代码2”中的test_read()里的内容做成一个通用函数(infile())的时候,就出问题,具体如下:
  1. 代码2(修改,将原来“内核读文件”的代码“移植去”lib.c的infile()函数,这里改为调用infile()以完成“内核读文件”):
  2. module_test.c

  3. test_read()
  4. {
  5.     char r_buf[10240];

  6.     infile("file.txt", r_buf, 10240);
  7. }
复制代码
  1. 代码4(增加一个lib.c文件,里面增加一个函数 infile()):
  2. lib.c

  3. char*        infile(char *filename, char *data, int len)
  4. {
  5.         mm_segment_t old_fs;
  6.         loff_t pos;
  7.         struct file *fp_r = NULL;
  8.         int j;
  9.                
  10.         for(j=0;j<10240;j++)
  11.         {
  12.                 data[j]        = NULL;
  13.         }

  14.         fp_r = filp_open(filename, O_RDONLY,0);        
  15.                
  16.         old_fs        = get_fs();
  17.           set_fs(KERNEL_DS);  
  18.           pos        = 0;
  19.         vfs_read(fp_r,data,sizeof(data),&pos);
  20.         set_fs(old_fs);

  21.         filp_close(fp_r,NULL);

  22.         return data;
  23. }
复制代码
  1. 代码3(修改,添加 lib.o):
  2. Makefile:

  3. obj-m := test.o
  4. test-objs         := module_test.o module_main.o lib.o

  5. KDIR                 := /usr/src/linux-headers-$(shell uname -r)

  6. all:        realclean mod clean

  7. mod:
  8.         make -C $(KDIR) M=`pwd` modules

  9. realclean:
  10.         rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd *.ko

  11. clean:
  12.         rm -rf *.o *.cmd .tmp* *.ko.cmd *.mod.c *.o.cmd .*.mod.o.cmd .*.ko.cmd .*.o.cmd

  13. install:
  14.         sudo insmod test.ko

  15. remove:
  16.         sudo rmmod test
复制代码

编译是成功的,但当执行 make install 时,整个ubuntu系统崩溃(死机,不响应任何键盘按键),只能按电源键重启。

为何会这样?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2017-01-04 20:21 |只看该作者
回复 1# kallytin

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

论坛徽章:
0
3 [报告]
发表于 2017-01-05 10:27 |只看该作者
char* infile(char *filename, char *data, int len)中sizeof(data)有错,这是对指针取sizeof。应该是len

论坛徽章:
0
4 [报告]
发表于 2017-01-05 13:10 |只看该作者
char r_buf[10240];

这么大的局部数组,真的没问题吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP