一、MINIX 文件系统

minix文件系统和unix的文件系统基本相同。它是由6个部分组成。

360KB软盘文件系统,整个磁盘被划分为1KB大小的磁盘块,每一个磁盘块对应一个逻辑块号。因此图中共有360个磁盘块,也即360个逻辑块号。(后面说的磁盘块和逻辑块等效)

数据区:用于表示文件数据的区域,其中每一逻辑块都有一个逻辑块号。

逻辑块位图:用于表示数据区的每一个逻辑块的使用情况。占用一个逻辑块,也即1024byte,,也即可以表示8192个逻辑块的使用情况,但是第一个bit位不使用,所以表示8191个逻辑块。当逻辑块为1KB,逻辑位图占用一块时,最多可以表示数据区8MB大小内存(理论情况),所以360KB的软盘,只保存一个文件,360 - (引导块 + 超级快 + i节点位图(1)+ 逻辑块位图(1)+ i节点(1))= 355块,那么这个文件最大可以355KB 。1表示使用、0表示未使用。(第一位不用会系统会设置为1,因为没有找到空闲块时会返回0,如果第一位使用的话,会导致返回0表示第一个块可以使用,导致异常)。

inode节点:用于表示一个文件的信息,一个inode节点占用32byte,所以一块可以表示32个inode节点。一个inode节点的数据保存在i_zone[9]数组中,0-6表示直接块号(7个块),7表示一次间接号(512个块,一个块1024byte,而一个块指针2byte,所有一个块可以有512个块指针),8表示二次间接号(512*512个块)。所以一个inode节点也即一个文件最多可以有262663个块(理论情况,对于360KB软盘最多只有360个块),所以文件最大为256MB。 如下图:

inode位图:用于表示inode节点的使用情况。同逻辑块位图一样。

超级快:用于表示各个元数据的元数据信息。定义了总的inode节点数量、总的逻辑块数量、inode节点位图、逻辑块位图占用的块数量、数据区第一个逻辑块号(因为逻辑位图的第一个bit位,表示的是数据区第一块的使用情况,即是相对数据区的块号,而不是从磁盘开始的块号)、最大文件长度(理论值4GB),逻辑位图最多占用8个块,所以在Linux0.11中,最多可以表示的文件大小为64MB,最大可以支持的块设备容量为64MB(也可以根据块数short占用2字节计算)。如下图:

引导块:引导启动、存储元数据和文件系统验证等重要功能。

二、Linux 0.1.1内存的表示

在Linux系统中,使用了高速缓存来保存磁盘的数据、以加快性能。

同样的道理,Linux系统中,假设有16 MB内存,将1MB-4MB之间的内存分割为同磁盘块1KB大小一样的缓存块,使用end--640K之间的内存来表示缓存块的使用情况。

buffer_head:表示缓存头信息,即每个缓存块的使用情况。以后系统需要访问磁盘时,都会通过一个buffer_head结构来和磁盘打交道,如果当前缓存中没有要访问的块号,则会找到一个缓存块来加载磁盘块信息,下次访问时,会直接使用这个缓存块进行crud。

缓存块头的初始化:

 

三、Linux 0.1.1文件操作

结构体

 

1)sys_open

文件打开的逻辑:文件路径/usr/src/linux

image-20240225183702270

2)sys_read

文件读取的逻辑:fd为open函数返回的/usr/src/linux的索引下标

 

image-20240225201353934

3)sys_write

文件写的逻辑:fd为open函数返回的/usr/src/linux的索引下标

 

四、Linux 2.6.0-NIO操作

结构体

poll_wqueues->poll_table_page->poll_table_entry->wait_queue_t

1)sys_select

调用链:sys_select()--->do_select()--->sock_poll()->tcp_poll()-->poll_wait()

例如要监听socket的事件,则需要将当前线程注册到对应socket的sock结构的sk_sleep链表上,等待事件发生时,唤醒线程

sys_select
do_select
sock_poll
__pollwait

2)sys_poll

调用链:sys_poll()--->do_poll()--->do_pollfd()--->sock_poll()->tcp_poll()-->poll_wait()

sys_poll
do_poll
do_pollfd

由于file->f_op->poll(file, pwait);总是会传入pwait,而不像select的(f_op->poll)(file, retval ? NULL : wait); 如果前面一个有返回时,后面的直接全部不处理监听

3)epoll

结构体

eventpoll->epitem->eppoll_entry->wait_queue_t

sys_epoll_create

创建一个虚拟文件来表示epoll本身,设置文件的操作方法eventpoll_fops

sys_epoll_ctl
ep_find
ep_insert
ep_ptable_queue_proc
ep_remove
sys_epoll_wait
ep_poll
ep_events_transfer
ep_collect_ready_items
ep_send_events