LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: sybaselu

file_operation这个关键的数据结构在那个头文件中?

[复制链接]
 楼主| 发表于 2004-7-27 15:03:53 | 显示全部楼层
7:我认为/dev/video是一个抽象的设备映象文件, 就像vfs虚拟的文件系统,他只提供统一的接口, 比如说基于bttvxx8和saa71xx芯片的tv cards当用modprobe saa7134 或modprobe bttv注册设备主设备号成功时,那么/dev/video的主设备号是一样的吗?
发表于 2004-7-27 16:12:43 | 显示全部楼层
最初由 sybaselu 发表
1:从用户态的open()如何转到核心态的sys_open()?
2:核心态函数sys_open()只在/linux/syscalls.h中给出函数原型, 在哪里给出其定义呢?
3:为什么sys_open()中的参数与struct file_operation中的函数指针参数不同
int (*open)(struct inode *inode, struct file *fiel)
在sys_open()中:
asmlinkage long sys_open(const char _usr *filename, int flags, int mode)
我不明白这里的asmlinkage的意思!
4:在/drivers/media/video/saa7134/saa7134-video.c主驱动中有如下子函数实现:
statics int video_open(struct inode *inode, struct file *flie)
..............
statics struct file_operation video_fops={
      ..............
      .open =      video_open;
      ................
}这里的.open=video_open就是子函数具体实现的代码! 原来是这里与关键数据结构发生关系!
5:斑竹讲到的flip_open()和open_namei()在哪里定义,有何作用?第一个图中的两条箭头线有何用意?
6:斑竹的"用户进程在用户态使用系统调用open返回该设备文件的文件描述符"有不明之处, fd就是返回的文件描述符, 他只是一个int型,如何从当接口呢?
谢谢!

1.其实系统调用就是软中断,也几乎是用户和内核打交道的唯一途径。为了屏蔽它的复杂性以及提高平台的可移植性,系统调用都被标准C函数库(Glibc)进行外封装,这种封装其实就是一组预处理宏(放在头文件中,这也是使用系统调用就必须得包含其头文件的原因),这组宏充当着内核态与用户态的转换器。这个宏把系统调用展开为含有int 0x80的汇编代码,int 0x80就是软中断(系统门),随即内核响应中断,进入内核态。

2.fs/open.c

3.asmlinkage的意思就是汇编连接,用于告诉编译器的。

4.我的意思就是这样。

5.买个关子,这两个函数也可以在sys_open所在的源文件找到,你自行分析。还是给点提示吧,open_namei搜索inode,而flip_open调用open_namei的同时进行文件权限验证。

6.内核为每次调用返回一个新的文件描述符以及它所对应的文件打开对象。

进程控制块PCB是描述进程的内核数据结构,它包括成员struct files_struct *fs,而这个fs又包含成员fd_set *open_fds,该成员指向打开文件描述符的指针,这个指针指向系统打开表,而文件描述符的值就是这个表数组的下标。

综合起来,进程根据open返回的文件描述符来定位它的struct file,而这个file数据结构就包含操作函数的成员。
发表于 2004-7-27 16:16:45 | 显示全部楼层
最初由 sybaselu 发表
7:我认为/dev/video是一个抽象的设备映象文件, 就像vfs虚拟的文件系统,他只提供统一的接口, 比如说基于bttvxx8和saa71xx芯片的tv cards当用modprobe saa7134 或modprobe bttv注册设备主设备号成功时,那么/dev/video的主设备号是一样的吗?


1.vfs存在于内存中,它用于管理所有的文件系统。

2.设备文件不是什么抽象的映像文件,而是实实在在的文件,具有inode,inode里面包含主次设备号。(不要太神化内核哦!它不过是一段复杂的代码而已)。

3.同是一个/dev/video文件,它的主设备号当然不变,但可以分配多个次设备号(比如我们常见的eth0,eth1...ethN)。主设备号才是设备驱动程序要注意的逻辑I/O概念!
 楼主| 发表于 2004-7-27 16:54:57 | 显示全部楼层
一时消化不了,再让我想想!..............
发表于 2004-7-27 16:59:04 | 显示全部楼层
不必要为自己设太多的问题,其实问题都是殊途同归的,理清思路最重要~~~:cool:

进程--文件--驱动
 楼主| 发表于 2004-7-27 17:59:46 | 显示全部楼层
磁盘分区上的文件系统中的格局如下:
引导块--(内核和引导参数?)--超级块---inode---数据;
1 :这里的inode存放的时系统上所有文件的inode吗?就是说文件数据和inode 是分开存放的!
2: 如果是所有的文件都存放在这里, 他们存放间有没有想目录样有层次关系?
3:我不太明白inode中的struct semaphore      i_sem;
                     struct rw_semaphore   i_allc_sem;
的意思?
                     struct file_operation  *i_fop在inode 中从当什么作用?以及    struct inode_operations *i_op
4:"这个宏把系统调用展开为含有int 0x80的汇编代码,int 0x80就是软中断(系统门),"这个斑竹能否进步解释呢?迫切想知道来龙去脉
先问这么多吧!
发表于 2004-7-27 22:00:15 | 显示全部楼层
不好意思。刚才有事出去了,现在讲解吧。好好听啰,呵呵~~~先别回帖,由于涉及问题比较多,我慢慢道来。网络不好,有时也会断线~~~~


1.文件系统的inode搜索依赖于具体文件系统。
先给出EXT2的逻辑磁盘示意图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-7-28 21:59:04 | 显示全部楼层
最初由 sybaselu 发表
磁盘分区上的文件系统中的格局如下:
引导块--(内核和引导参数?)--超级块---inode---数据;
1 :这里的inode存放的时系统上所有文件的inode吗?就是说文件数据和inode 是分开存放的!
2: 如果是所有的文件都存放在这里, 他们存放间有没有想目录样有层次关系?
3:我不太明白inode中的struct semaphore      i_sem;
                     struct rw_semaphore   i_allc_sem;
的意思?
                     struct file_operation  *i_fop在inode 中从当什么作用?以及    struct inode_operations *i_op
4:"这个宏把系统调用展开为含有int 0x80的汇编代码,int 0x80就是软中断(系统门),"这个斑竹能否进步解释呢?迫切想知道来龙去脉
先问这么多吧!

1.VFS逻辑分区总统率所有注册的文件系统,如ext2(逻辑磁盘结构示意图如上)。*nix采用inode来记录文件信息以及它的数据块指针i_blocks。

2.目录是一种特殊文件,它也有inode,它的数据区存放着若干目录项,分别代表它的子目录。

3.struct file_operation  *i_fop是初始化inode时用以定义它的f_op的,也就是打开这个文件后返回的file数据结构中的struct file_operations f_op成员。
struct inode_operations *i_op是inode本身的操作函数struct指针,它与file_oprations的区别是,前者是与文件系统(数据块)无关的操作(link,rename),后者是与文件系统(数据块)相关的操作。(read,write)。

至于那些*_sem函数,相比前面的概念并不重要,这里不多说了,说多了反而会乱。

4.GLIBC提供的宏封装例程把系统调用函数的参数保存到EAX,EBX,ECX,EDX,ESI,EDI后,进而执行指令int 0x80(这就是内核态的入口),一般形式是__syscallN(0<=N<=6)。

  1. #define __syscallN(type,name,type1,arg1,type2,arg2,...)
  2. type name (type1 arg1,type2 arg2,...)
  3. {
  4. long __res;
  5. __asm__volatile("[b]int $0x80[/b]"
  6. : "=a" (__res)
  7. :"0" ([b]__NR_##name[/b]), "b"((long)(arg1)),...
  8. ...
  9. __syscall_return(type,__res);
  10. }
复制代码

__NR_##name就是系统调用号,在include/asm/unistd.h有定义,
...
#define __NR_exit 1
...
而这个条目值就是系统调用表(arch/i386/kernel/entry.S)的相对偏移量,
.data
ENTRY(sys_call_table)
...
.long SYMBOL_NAME (sys_open)
...

而这个条目值就是中断响应函数的入口地址了。
配合上面提及的通用寄存器,开始执行中断响应。



至于你提及的系统调用与文件系统的关系,涉及的函数的确很多(文件系统涉及很多数据结构如哈希表,比较难读),但最终结果才是我们所重视的。那就是进程用open()调用打开一个文件后,用户态返回文件描述符fd,保存在进程控制块的files_struct中,而内核态生成文件结构file,保存在fd_array[fd]数组中。注意到,文件描述符就是那个数组的索引值!通过索引值,可以找到fd_array[fd],也就找到了fd_array[fd]->f_op文件操作函数的struct指针,以后的read,write都需要这个文件描述符fd作为参数才能对文件进行操作。

不过,我稍后也会把这个繁杂的过程用源码标示出来,请等待。最近几天比较忙,不好意思。:p
发表于 2004-7-28 22:12:25 | 显示全部楼层
或许我先给出函数关系吧。你可以自行分析一下。

  1. sys_open --> filp_open --> open_namei -----------> path_lookup
  2.              |            |                    |-->__lookup_hash -->ext2_lookup -->ext2_inode_by_name-->ext2_find_entry               
  3.              |            |                                            |-->iget         }==>file
  4.              |            |----------------------------------------------->dentry_open  }
  5.              |--------------------------------------------------------------------------->fd_install(file,fd)
复制代码
 楼主| 发表于 2004-7-30 09:37:17 | 显示全部楼层
1。用户态用open()打开后返回fd(文件描述符), fd是标识一个文件被打开的模式, 因为一个文件可以本不同的用户以不同的方式打开,fd用于找出在系统打开表和用户进程打开表中的标识,标明用户不同的操作方式对文件!
2。斑竹提到系统调用“asmlinkage datatype _sys_open(parameter table)”用/fs/open.c实现, 可是open.c是个编译单位c源码, 而asmlinkage datatype _sys_open()这是个函数,而且有带参数啊!这是咋回事?为什么系统调用的实现不放在一个目录下,这样不更清晰吗?
3。指令int ox80是中断服务程序的入口地址吗?由他转向中断子程序处理表,如果是, 要不要还乘四个字节呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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