免费注册 查看新帖 |

Chinaunix

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

[C] 請教關於kernel讀取txt檔問題 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-20 23:11 |只看该作者 |倒序浏览
請問一下,下面這個程式我如果不用driver的方式撰寫,而是把裡面讀取的function放到其他driver內 ex: display的驅動內,想讓他在開機的時候載入一些txt資訊給 display的驅動,編譯完成的時候都不會有錯誤,但是燒入後開機進入kernel前老是卡在Uncompressing Linux...done, booting the kernel
不知道有神麼辦法解決這個問題,謝謝

參考:http://daydreamer.idv.tw/rewrite.php/read-65.html
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. #include <linux/slab.h>
  5. #include <linux/unistd.h>
  6. #include <linux/sched.h>
  7. #include <linux/fs.h>
  8. #include <linux/file.h>
  9. #include <linux/mm.h>
  10. #include <asm/uaccess.h>

  11. mm_segment_t oldfs;

  12. struct file *openFile(char *path,int flag,int mode)
  13. {
  14. struct file *fp;

  15. fp=filp_open(path, flag, 0);
  16. if (fp) return fp;
  17. else return NULL;
  18. }

  19. int readFile(struct file *fp,char *buf,int readlen)
  20. {
  21. if (fp->f_op && fp->f_op->read)
  22. return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
  23. else
  24. return -1;
  25. }

  26. int closeFile(struct file *fp)
  27. {
  28. filp_close(fp,NULL);
  29. return 0;
  30. }

  31. void initKernelEnv(void)
  32. {
  33. oldfs = get_fs();
  34. set_fs(KERNEL_DS);
  35. }

  36. static int __init readfile_init(void)
  37. {
  38. char buf[1024];
  39. struct file *fp;
  40. int ret;

  41. initKernelEnv();
  42. fp=openFile("/etc/myconfig",O_RDONLY,0);
  43. if (fp!=NULL)
  44. {
  45. memset(buf,0,1024);
  46. if ((ret=readFile(fp,buf,1024))>0)
  47. printk("buf:%s\n",buf);
  48. else printk("read file error %d\n",ret);
  49. closeFile(fp);
  50. }
  51. set_fs(oldfs);
  52. return 0;
  53. }

  54. static void __exit readfile_exit(void)
  55. {

  56. printk("read file module remove successfully\n");
  57. }
  58. module_init(readfile_init);
  59. module_exit(readfile_exit);

  60. MODULE_DESCRIPTION("read a file in kernel module");
  61. MODULE_AUTHOR("Joey Cheng<jemicheng@gmail.com>");
  62. MODULE_LICENSE("GPL");
  63. MODULE_ALIAS("read file module");
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-11-21 09:25 |只看该作者
这个, 不懂啊, 但至少你要看文件驱动程序和你的显卡驱动程序谁先被调入内核。

论坛徽章:
0
3 [报告]
发表于 2013-11-21 20:23 |只看该作者
回复 2# folklore

不好意思,我在改一下,主要就是在display的Probe裡呼叫read file的function
,這個function經過測試單獨寫成一個driver Probe是可以執行的,但是我現在把它變成function的方式就會卡在開機畫面,謝謝
  1. mm_segment_t oldfs;

  2. struct file *openFile(char *path,int flag,int mode)
  3. {
  4. struct file *fp;

  5. fp=filp_open(path, flag, 0);
  6. if (fp) return fp;
  7. else return NULL;
  8. }

  9. int readFile(struct file *fp,char *buf,int readlen)
  10. {
  11. if (fp->f_op && fp->f_op->read)
  12. return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
  13. else
  14. return -1;
  15. }

  16. int closeFile(struct file *fp)
  17. {
  18. filp_close(fp,NULL);
  19. return 0;
  20. }

  21. void initKernelEnv(void)
  22. {
  23. oldfs = get_fs();
  24. set_fs(KERNEL_DS);
  25. }

  26. int readfile(void)
  27. {
  28.    char buf[1024];
  29.    struct file *fp;
  30.    int ret;

  31.    initKernelEnv();
  32.    fp=openFile("/system/abc.txt",O_RDONLY,0);
  33.    if (fp!=NULL)
  34.     {
  35.         memset(buf,0,1024);
  36.         if ((ret=readFile(fp,buf,1024))>0)
  37.             printk("buf:%s\n",buf);
  38.         else printk("read file error %d\n",ret);
  39.         
  40.         closeFile(fp);
  41.     }
  42.     set_fs(oldfs);
  43.     return 0;
  44. }



  45. void main() //假設為display的主程式(Probe)
  46. {
  47.    int ret;
  48.    
  49.    ret=readfile(); 這是我呼叫上面的function

  50. }
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2013-11-22 08:39 |只看该作者
回复 3# leon1235


    驱动程序没有主函数, 只有“初始化函数”(Init)或是“入口”(Entry),
你在入口程序中使用文件系统显然是不行的。
(事实上,
在大多数OS中,
显卡驱动一直是最早被载入的驱动,
原因很明显,
因为系统的其它部分要显示消息,
而在允许显示消息的同时更改驱动程序显然是不经济的,
这至少需要每次消息要加个额外的锁
)。
所以, 一般情况下显卡驱动程序不能使用文件系统, 因为此时文件系统还没准备好。

驱动程序,只有系统能够保证文件系统已被调入内核时才能使用,
(也就是非核心驱动的非Entry函数中才能使用, 比如驱动机械马达的动作的函数),

显示驱动的情况,
在Linux下, 这显然是不行的。因为系统只有到最后一步,才会挂上真实的根文件系统。

显示驱动和键盘驱动是两个比较特殊的驱动程序。

论坛徽章:
0
5 [报告]
发表于 2013-11-22 23:19 |只看该作者
本帖最后由 leon1235 于 2013-11-23 00:06 编辑

回复 4# folklore

謝謝大大的解說,我說明一下我想要的應用,我們是作DISPLAY的驅動iC商,我們在測試顯示IC時常常會去變更顯示DRIVER裡的Initial Code(說穿了就是一個數字與字串組合的陣列而已),目前的方法也就只能在一開始的c code裡更改完再compiler後燒錄,但是這樣往往會花費非常多的時間去完成這樣的動作,所以才想看看能不能讓我們在正常進入系統後修改一個文件檔待等會重開機後就載入新更改的Initial Code,不知道這樣的觀念還有沒有甚麼可以實現的替代方案呢?謝謝


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP