20 lines
1.8 KiB
Markdown
20 lines
1.8 KiB
Markdown
# 代码注释
|
||
|
||
## 文件系统逻辑
|
||
文件系统里面的东西写的比较奇怪,他的目录构成是这样的:
|
||
```
|
||
<设备名>/<路径名>
|
||
```
|
||
|
||
在open调用里面有一个`get_index`(kernel/vfs.c:175), 它会自动把第一个`/`前面的部分作为设备名,然后在文件系统的描述符表中去匹配。然后返回设备编号。同时还会更新原来传进去的路径名,把前面的设备名称和`/`给去掉,取后面的路径名。这个东西写的真的很奇怪。。。由于它意义不明的代码,对于没有`/`存在的路径名,他的设备名就是路径名。
|
||
|
||
对于字节设备而言,open/close/read/lseek/unlink貌似都是直接转发到`real_<operation>`(kernel/fs.c)里面,也就是在初始化的时候给进去的函数指针。open/unlink有一个处理设备名的过程,这个设计可以说是很智障了。write操作有些许不同,他是将字节划分成512字节的小块写入设备,不过他的实现好想,有点小问题。。。
|
||
|
||
tty设备占据vfs表的前三项,分别对应tty0-2,然后每个设备都会分配一个超级块superblock,不过这三个设备的操作都是一样的。
|
||
|
||
在文件系统初始化的时候,会专门给tty分配inode,然后把inode的`start_sect`设置为`(DEV_CHAR_TTY<<8)|<tty_id>`,后面就用这个来确定tty号;然后还会特地设置他的inode_nr以便后面匹配inode。然后在open的时候,首先根据路径名,从root inode开始匹配inode的名字,然后返回一个inode_nr(可以看做是inode指针);会根据设备和inode_nr来获取最终的inode,最后塞进文件描述符表中。
|
||
|
||
真正调用tty的地方是在kernel/fs.c:do_rdwt,他会判断出打开的设备是啥,然后调用`tty_read/write`来进行实际的读写。
|
||
|
||
## 键盘和tty
|