资讯库 厂家库 产品库 / 咨询专线:400-6668-369 / 服务时间:8:00-18:00(非节假日)
中国办公家具产业基地,专业助力办公家具单位采购。

进程1与内核文件表挂接为打开文件做准备

进程1开始打开终端设备文件。它将通过调用open函数来实现此目的,执行代码如下:
 
//代码路径:init/main.c:
 
voidinit(void)
 
{
 
……
 
(void)open("/dev/tty0",O_RDWR,0);
 
……
 
}
 
其中实参"/dev/tty0"表明了这个终端设备文件在根设备上的位置。
 
这个函数执行后,也会产生软中断,并最终映射到sys_open这个函数中去执行,具体的映射过程与本章2.2.1节中介绍的fork函数映射到sys_fork的方式大体一致。
 
进入sys_open函数中执行后,先在进程1的管理结构中的“文件打开控制结构*filp[20]”里申请一个空闲项,执行代码如下:
 
//代码路径:fs/open.c:
 
intsys_open(constchar*filename,intflag,intmode)
 
{
 
……
 
for(fd=0;fd<NR_OPEN;fd++)
 
if(!current->filp[fd])
 
break;
 
……
 
}
 
之后,在系统中的文件管理结构file_table中也为该文件申请一个空闲项,执行代码如下:
 
//代码路径:fs/open.c:
 
intsys_open(constchar*filename,intflag,intmode)
 
{
 
……
 
f=0+file_table;
 
for(i=0;i<NR_FILE;i++,f++)
 
if(!f->f_count)break;
 
……
 
}
 
最后,把两者进行挂接,并将文件管理结构file_table中的文件引用次数加1,表明这个位置所对应的文件已经被使用一次了,执行代码如下:
 
//代码路径:fs/open.c:
 
intsys_open(constchar*filename,intflag,intmode)
 
{
 
……
 
(current->filp[fd]=f)->f_count++;
 
……
 
}
 
这样进程1就与文件管理结构file_table建立了关系,将来tty0文件成功打开以后,将登记在这个在文件管理结构file_table中与进程挂接的空闲项上,这样进程1就具备了操作tty0文件的能力了。进程1与内核file_table结构中空闲项的挂接状态如图2-67所示。
 
 
 
图2-67 打开终端设备文件的准备工作
 
接下来就要调用sys_open中的主体open_namei函数了,开始实质性的打开文件操作,执行代码如下:
 
//代码路径:fs/open.c:
 
intsys_open(constchar*filename,intflag,intmode)
 
{
 
……
 
if((i=open_namei(filename,flag,mode,&inode))<0)
 
……
 
}
 
这个函数的主要目的就是找到这个终端设备文件的i节点,因为找到了这个文件的i节点,就可以找到这个文件的全部内容,关于i节点的具体内容,将在本书后续与文件操作相关的章节中详细介绍。
 

相关资讯