LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 965|回复: 9

驱动里边可以用open()系统调用或者fopen()库函数吗?

[复制链接]
发表于 2005-10-14 09:27:13 | 显示全部楼层 |阅读模式
rt

thx
发表于 2005-10-14 10:43:38 | 显示全部楼层
Post by macarthor
rt

thx


fopen不能使用
open 一般情况下不能使用,下面便是一个原因:

  1. fs/namei.c  do_getname():

  2.     119     if ((unsigned long) filename >= TASK_SIZE) {
  3.     120         if (!segment_eq(get_fs(), KERNEL_DS))
  4.     121             return -EFAULT;
  5.     122     } else if (TASK_SIZE - (unsigned long) filename < PATH_MAX)
  6.     123         len = TASK_SIZE - (unsigned long) filename;
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-14 10:52:00 | 显示全部楼层
What's THIS???

另外,可以讲讲不能用的原因吗?或者给个链接,谢谢
回复 支持 反对

使用道具 举报

发表于 2005-10-14 11:11:16 | 显示全部楼层
fopen 不能用是肯定的,她是c库函数,需要动态链接,在fopen里面又会调用其他的c库函数,驱动程序没有c库支持.
open事实上不能直接用,当然可以通过自己写一个_syscall3原型就能用了,但是用了可能会失败,上面那一段代码就是会失败的一个原因.filename会>TASK_SIZE,然后下面那个if语句也可能成立.这就要看你在什么环境下怎么用这个open了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-14 11:20:43 | 显示全部楼层
那驱动里我要访问一个文件,比如read/write/seek一个文件/root/test.txt,该怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2005-10-14 11:50:31 | 显示全部楼层
文件名通过用户空间的指针传进内核就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-14 12:04:18 | 显示全部楼层
能给具体讲讲吗?谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-10-16 10:51:21 | 显示全部楼层
内核你不是有相应的函数吗
open对应sys_open
write对应sys_write
等等,以前做课设用过,现在不是很记得了
回复 支持 反对

使用道具 举报

发表于 2005-10-16 10:52:16 | 显示全部楼层
cat /proc/kallsyms
看一下
回复 支持 反对

使用道具 举报

发表于 2005-10-16 14:52:19 | 显示全部楼层
Post by macarthor
能给具体讲讲吗?谢谢!


看你怎么用这个驱动程序了,如果按照通常的读写,可以考虑通过read或者write的buffer传进去.
其实不这样也行,在open之前先orig=get_fs(),set_fs(KERNEL_DS),最后再set_fs(orig),如果按照楼上的说法,只能这样做了.
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表