文件系统占得代码比较多,我们将从提供给用户的api开始逐步进入核心,顺藤摸瓜!最终获取文件系统的抽象+设备的组织。
【设备号】
/* * 系统所含的设备如下:(与minix 系统的一样,所以我们可以使用minix 的 * 文件系统。以下这些是主设备号。) * * 0 - 没有用到(nodev) * 1 - /dev/mem 内存设备。 * 2 - /dev/fd 软盘设备。 * 3 - /dev/hd 硬盘设备。 * 4 - /dev/ttyx tty 串行终端设备。 * 5 - /dev/tty tty 终端设备。 * 6 - /dev/lp 打印设备。 * 7 - unnamed pipes 没有命名的管道。 */
【用户APIs】
1. read
2. write
3. open
4. close
5. create
6. link/unlink
7. mknod
8. chmod
9. chown
10. mount/unmount
11. fstat
12. access
13. sync
14. rename
15. mkdir
16. rmdir
17. dup
18. pipe
19. ioctl
20. fcntl
【块设备驱动】
linux/kernel/blk_drv/
+--------- blk.h 块设备驱动头文件
+--------- ll_rw_blk.c 块设备驱动模块接口文件, 向上层的文件系统提供
+--------- floppy.c 软盘驱动程序
+--------- hd.c 硬盘驱动程序
+--------- ramdisk.c 内存虚拟盘驱动程序
块设备驱动模块工作原理图:ll_rw_block()为对上层的接口函数
【字符设备驱动】
TTY抽象了字符设备,统一了字符设备的读写操作.
共存着三个TTY设备,一个为控制台,2个为串行终端。工作原理类似
现在考察下TTY的read_q, write_q, secondary中的内容及转换规则.
copy_to_cooked()函数,这个行规则函数的主要作用是把read_q中的字符经过适当的处理后放入规范队列secondary,并且在处理过程中,若相应终端设备设置了回显标志,还会把字符放入写队列(write_q)中。从而最终在终端屏幕上显示出刚输入的字符。
1. 串行设备直接将收到的字符放入read_q, 然后由TTY进行cooking:-),分发到secondary和write_q队列。
将write_q的内容如实发送给远程。
2. 控制台设备与串口设备类似,这里有意思的是字符序列(控制序列)规则。
keyboard.S 是键盘驱动程序, 将功能键F1-Fn扫描码变换成转义字符序列并存放在read_q中,将普通按键变换成ascii码,将Ctrl+keyDown变换成控制字符(0x00--0x1F)。
(ASCII:http://www.96yx.com/tool/ASC2.htm)
A. 转义序列
B. 控制序列
【补充】
TTY模块向上层文件系统提供的接口为tty_read() && tty_write()。
a. 对输入字符的处理从copy_to_cooked()分析。
b. 对输出字符的处理从con_write()分析。
下一章总结高速缓冲区、文件类型、内核文件表、文件系统格式开始…