szLee
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4403回复:12

请问,linux 驱动程序中如何读取文件,我曾用sys_open试图打开一个文件,但死机了,请大侠指教,谢谢!!!

楼主#
更多 发布于:2004-04-23 09:02
我曾用sys_open试图打开一个文件,但死机了,请大侠指教,谢谢!!!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-24 14:47
你用什么打开的?
cat /dev/device_drv?
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-24 23:06
驱动中读取文件??
是指在驱动中调用的么?对于这个问题:如是在内核态对文件的操作的话,就到www.linuxforum.net中查一下,上面讨论过!
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
szLee
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-26 11:44
我是想在驱动程序中,打开一个文本文件,并从文件中读入一些信息,就是去读一些配置信息。我的系统是RedHat 8.0,有些资料上讲可以通过sys_call_table调用相应系统函数,但好像2。4。18以上不支持,直接用sys_open打开文件也不行,只要执行sys_open,系统就死机了,只能断电重新启动。谢谢各位大侠指教,还请各位多给予帮组,再次谢过!!!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-27 07:12
你的意思是把ap层的信息读到kernel中?
szLee
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-27 08:47
是,但不知道有什么好办法,我实在不知道再内核驱动中怎么不打开和读写一个文件,望各位大侠给予多多帮组指教
szLee
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-27 08:49
是,但不知道有什么好办法,我实在不知道在内核驱动中怎么才能打开和读写一个文件,望各位大侠给予多多帮组指教,不好意思,刚才敲错了几个字

highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-27 09:24
你到www.linuxforum.net上去问吧!!
以前我也遇到过这样的问题,想在驱动的open()中下载firmware,是要将firmware文件内容写到设备的SDRAM里,结果想来想去还是在应用层实现了!

尽量不要在内核模块中存取文件,在内核模块中不用文件描述符,用sys_open等等编译可以通过
但在模块载入时,sys_open返回-14(EFAULT)也就是bad address,是这样的,打开文件名 是在内核空间中,而sys_open作为系统调用的实现,文件名都是在用户空间中的,要将其拷贝到 内核空间,而此时文件名已经在内核空间中,所以bad address


另外对于读写:
a. 内核文件系统提供的read()和write()之类(最终为fp->f_op->read 或fp->f_op->write)的函数,期望是对用户态程序服务的,所以它会验证读写缓冲区不超过用户空间的上限即0xC000 0000。但现在内核中要读写文件,缓冲区在内核中即地址会超过0xC000 0000。
b. 在读写文件前先得到当前fs:mm_segment_t old_fs=get_fs();
并设置当前fs为内核fs:set_fs(KERNEL_DS);
在读写文件后再恢复原先fs: set_fs(old_fs);
set_fs()、get_fs()等相关宏在文件include/asm/uaccess.h中定义。
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-27 09:27
附上一个以前另一论坛上的贴,也许会有帮助:
各位大侠,我用sys_open和sys_read怎么读不出东西来呀?用sys_open函数返回什么值是成功打开文件?我运行了一次,返回值是 -14.我的源代码如下,请各位老兄会诊一下:
#define MODULE
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/utime.h>
#include <linux/file.h>
#include <linux/smp_lock.h>
#include <linux/quotaops.h>
/*#include <linux/dnotaops.h>*/
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/pagemap.h>
#include <asm/uaccess.h>

#define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
asmlinkage long sys_open(const char * filename, int flags, int mode)
{
char * tmp;
int fd, error;

#if BITS_PER_LONG != 32
flags |= O_LARGEFILE;
#endif
tmp = getname(filename);
fd = PTR_ERR(tmp);
if (!IS_ERR(tmp)) {
fd = get_unused_fd();
if (fd >= 0) {
struct file *f = filp_open(tmp, flags, mode);
error = PTR_ERR(f);
if (IS_ERR(f))
goto out_error;
fd_install(fd, f);
}
out:
putname(tmp);
}
return fd;

out_error:
put_unused_fd(fd);
fd = error;
goto out;
}



int init_module(void)
{
/*struct file *fd;*/
int fd;
char buffer[60]=\"the buffer is\";
if((fd=sys_open(\"/root/chengyw/debug/data-debug\",0x01,0))!=0)
{
printk(\"open successfuly fd=%d \\n\",fd);
sys_read(fd,buffer,60);

printk(\"the buffer is\\n%s\\n\",buffer);

}
else
{printk(\"open error\\n\");}
return 0;
}
void cleanup_module(void)
{
/* if (flag == 1)
fput(\"/root/chengyw/debug/data-debug\");

*/
printk(\"Goodbye\\n\");
}



答复:
kernel-to-kernel system calls must be wrapped by the following
code:

mm_segment_t fs;

fs = get_fs(); /* save previous value */
set_fs (get_ds()); /* use kernel limit */

/* system calls can be invoked */

set_fs(fs); /* restore before returning to
user space */]

There\'s no need to wrap each individual system call, so several
calls can be performed between set_fs()...set_fs() pairs. It\'s
important, however, that the original fs is restored before
returning to user space. Otherwise, the user program that executed
this code will retain permission to overwrite kernel memory by
passing bogus pointers to further read (or ioctl) system calls.
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-27 09:29
差点忘了,到看看下面这个网页吧,很有帮助
http://www.linux-mag.com/2000-11/gear_01.html
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-27 09:31
差点忘了,到看看下面这个网页吧,很有帮助
http://www.linux-mag.com/2000-11/gear_01.html

唉唉唉唉啊!改行了,由于板子未到人力不够,老板让我搞VC了,干控件了,郁闷郁闷郁闷!
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-27 13:54
可以考虑一下proc文件系统。
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-28 17:23
呵呵呵!今天下午修改以前一驱动,成功地在open()中下载firmware!
也用了proc文件系统,不过是向外写数据。
要读进去的话似乎比较烦,没有深入研究!下次再试!
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
游客

返回顶部