文件系统(一)

来源:互联网 发布:岳游网络联机捕鱼ol 编辑:程序博客网 时间:2024/05/22 17:48

文件系统占得代码比较多,我们将从提供给用户的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()为对上层的接口函数

blkdrv

【字符设备驱动】

TTY抽象了字符设备,统一了字符设备的读写操作.

chrdrv

共存着三个TTY设备,一个为控制台,2个为串行终端。工作原理类似

chrdrv-con

chrdrv-sr

现在考察下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)

ascii

A. 转义序列

转义序列

B. 控制序列

控制序列

【补充】

TTY模块向上层文件系统提供的接口为tty_read() && tty_write()。

a. 对输入字符的处理从copy_to_cooked()分析。

b. 对输出字符的处理从con_write()分析。

 

下一章总结高速缓冲区、文件类型、内核文件表、文件系统格式开始…