首先要知道linux系统/dev目录下的各种设备文件(文件属性c打头)并不占用空间,你可以发现他们的大小为0字节,他们的区别在于文件的i节点的成员i_zone[0]的值不同,该值标识不同的设备号。比如tty0文件的设备号为0x0400,tty1设备号为0x0401,hd0设备号为0x0300,hd1设备号为0x0301等。而这个设备号里面又包含两部分内容:高字节标识不同类设备,比如tty0和hd0分别为0x04,0x03,低字节标识同一类设备不同序号。
接下来对linux0.11打开的第一个文件tty0的过程进行分析:
1. main.c文件:执行open("/dev/tty0",O_RDWR,0),调用该函数将触发系统调用sys_open()。
2. open.c文件:进入该系统调用函数sys_open,首先分配一个文件句柄fd(第一个文件为0,其实是文件表到索引),然后为这个打开的文件在文件表(file_table.c定义的一个数组)中寻找一个有效的空闲项,将这个空闲项的文件指针添加到当前进程结构的flip成员中(flip成员为一个指针数组),并将文件引用次数+1。接着调用open_namei函数获取tty0设备文件的i_node指针。最后将该指针赋给文件表的f_inode成员。至此,tty0文件打开完毕,并将其inode信息保存于cur