免费注册 查看新帖 |

Chinaunix

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

请教关于字符驱动中的inode与file结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-29 11:15 |只看该作者 |倒序浏览
最近刚刚开始学习驱动
看到字符驱动就有很多不明白的地方

file中有指针*f_op指向file_operation
而file_operation中操作
比如ssize_t(*read)  (struct file*,char,size_t,loff_t*)
中又包含了file指针
看起来像互相包含,所以很难理解

我开始理解是先注册major,minor和设备名称
然后建立一个对应的文件结构,文件中的*f_op是file_operation结构的入口
驱动就是通过file去调用*f_op中的read,write等具体的函数
file_operation中的file*是用来读和写回到指定地址空间的,比如在file中指定一个缓存区

对于int (*ioctl)(struct inode ,strcut file*,unsigned int, unsigned long);
中的inode和file具体应用中的区别也不是很清楚

刚开始看,可能问题本身就问的比较可笑
请大家多指教,谢谢

论坛徽章:
0
2 [报告]
发表于 2006-01-30 19:06 |只看该作者
我是这样理解的:
fop 指向的file_operations结构是你的应用程序调用的.
象dd这样的程序,在执行
dd if=/dev/hda of=/dev/dev count=512
这样的指令时要用到在file结构里面的read函数.
而标记语法将驱动程序的函数映射到file结构里面的函数里面去。

而sszie_t *read(struct file * ,struct inode *)
前一个是代表打开的文件.
后一个是该文件在硬盘上的存储.unix一个文件对应一个inode.

unix中设备与文件是等价的.所以你在对设备进行操作的时候,所操作的设备就可以当作上面read函数里面的
file所以这也是不矛盾的.

我也在学习linux的device driver.
希望多交流,共同进步.

论坛徽章:
0
3 [报告]
发表于 2006-01-30 21:42 |只看该作者
呵呵,第一次发贴
很希望有人能回复

是否可以这样理解:
执行
dd if=/dev/hda of=/dev/dev count=512
这样的指令时要用到在file结构里面的read函数.
那么由于我们已经注册了相应的设备
所以可以调用相应名称的file结构里的read函数
调用read函数:
sszie_t *read(struct file * ,struct inode *)
在read里的file指的是一个设备本身,也就是包含了它的硬件地址等等信息
而前面提到的包含fop的file是与应用程序相关联的,用途是通过它连接我们编写具体的read等一系列函数.

现在感觉我的问题出在,对于这两个file是否指的是同一个文件没有搞清楚
如果我上面理解是正确的,这两个file指的并不是同一个文件的话
那么这两个文件又是通过什么过程分别建立的呢?
所以又感觉它们是同一个文件..

我也是刚开始学linux
对linux本身也并不是非常了解
感觉看字符驱动已经很吃力了
希望可以和大家多交流~

[ 本帖最后由 xiaxiuqiu 于 2006-2-5 10:57 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-01-31 14:06 |只看该作者
前段时间正好看了字符驱动,把我的理解讲一下:
当你在应用层调用应用程序的时候,会OPEN一个设备节点,每个设备都会有这么一个设备节点
此时,会建立一个设备的FILE结构,这个file结构建立后,驱动程序中的read这些功能函数和这个具体设备就建立了连接。
接下来,在应用程序里调用read这个函数的时候,会调用内核层里的系统函数sys_read,这个函数会调用设备驱动file_operations中的read函数
你说的2个file结构,按我的理解应该是一个结构。
有段时间没有看了,可能不够精确,但是大体应该是这个意思。

论坛徽章:
0
5 [报告]
发表于 2006-01-31 17:48 |只看该作者
两个file肯定是同一个数据结构。

fops本来就是file的一个子集,当一个进程打开一个设备时,就会产生一个file结构,
里面保存了设备信息。比如private_data就可以用来保存一些设备数据,在read/write函数里就要用到,当然
并不是这一个字段对操作的函数有用,所以read选择了指向整个file然后通过file再指向具体需要的字段。

所以两个file一点也不矛盾。

论坛徽章:
0
6 [报告]
发表于 2006-01-31 21:26 |只看该作者
好的,谢谢了

论坛徽章:
0
7 [报告]
发表于 2006-02-06 09:45 |只看该作者
原帖由 xiaxiuqiu 于 2006-1-29 11:15 发表
最近刚刚开始学习驱动
看到字符驱动就有很多不明白的地方

file中有指针*f_op指向file_operation
而file_operation中操作
比如ssize_t(*read)  (struct file*,char,size_t,loff_t*)
中又包含了file指针
看 ...


OO思想在C代码里简单实现的惯用手法,相当于C++隐含的this指针

论坛徽章:
0
8 [报告]
发表于 2006-02-06 10:28 |只看该作者
互相引用,很正常啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP