|
发表于 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)。
- #define __syscallN(type,name,type1,arg1,type2,arg2,...)
- type name (type1 arg1,type2 arg2,...)
- {
- long __res;
- __asm__volatile("[b]int $0x80[/b]"
- : "=a" (__res)
- :"0" ([b]__NR_##name[/b]), "b"((long)(arg1)),...
- ...
- __syscall_return(type,__res);
- }
复制代码
__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 |
|