Linux 0.1.1文件系统的源码阅读
linux 0.11编译方法

linux 0.11编译方法
Linux 0.11是Linux内核的一个早期版本,其编译方法相比现代版本有所不同。
下面是大致的编译步骤:
1.获取源代码
获取Linux 0.11的源代码。
这个版本的代码可以在历史存档中找到。
你可以从网络上找到存档并下载,或者使用像GitHub等代码托管平台上的存档。
2.准备编译环境
确保你的系统拥有合适的编译环境。
Linux 0.11是早期版本,可能需要特定的编译器和工具链。
一般来说,你需要安装合适版本的GCC编译器和相关的开发工具。
3.编辑Makefile
进入Linux 0.11源代码目录,在Makefile中设置适当的编译选项。
你可能需要调整编译器参数和其他配置,以适应你的系统环境。
4.运行编译命令
在Linux 0.11源代码目录中,运行适当的编译命令。
在这个版本中,可能有一个名为make或make all的命令可以启动编译过程。
5.处理编译错误
如果出现编译错误,需要根据错误信息进行调试和修复。
这个过程可能需要查看源代码,理解错误原因,并进行相应的修改。
6.生成内核镜像
一旦编译成功,你将会得到一个内核镜像文件。
这个文件可以用于启动系统。
请注意,Linux 0.11是一个非常早期的版本,其编译和构建流程可能相当复杂和不稳定。
同时,这个版本可能并不适用于现代硬件,可能需要进行适当的修改才能在当前系统上运行。
在学习和尝试编译早期版本的Linux内核时,请确保备份数据和系统,以免造成不可逆的损失。
Linux 0.1.1文件系统的源码阅读

Linux 0.11文件系统的源码阅读总结1.minix文件系统对于linux 0.11内核的文件系统的开发,Linus主要参考了Andrew S.Tanenbaum 所写的《MINIX操作系统设计与实现》,使用的是其中的1.0版本的MINIX文件系统。
而高速缓冲区的工作原理参见M.J.Bach的《UNIX操作系统设计》第三章内容。
通过对源代码的分析,我们可以将minix文件系统分为四个部分,如下如1-1。
●高速缓冲区的管理程序。
主要实现了对硬盘等块设备进行数据高速存取的函数。
●文件系统的底层通用函数。
包括文件索引节点的管理、磁盘数据块的分配和释放以及文件名与i节点的转换算法。
●有关对文件中的数据进行读写操作的函数。
包括字符设备、块设备、管道、常规文件的读写操作,由read_write.c函数进行总调度。
●涉及到文件的系统调用接口的实现,这里主要涉及文件的打开、关闭、创建以及文件目录等系统调用,分布在namei和inode等文件中。
图1-1 文件系统四部分之间关系图1.1超级块首先我们了解一下MINIX文件系统的组成,主要包括六部分。
对于一个360K软盘,其各部分的分布如下图1-2所示:图 1-2 建有MINIX文件系统的一个360K软盘中文件系统各部分的布局示意图注释1:硬盘的一个扇区是512B,而文件系统的数据块正好是两个扇区。
注释2:引导块是计算机自动加电启动时可由ROM BIOS自动读入得执行代码和数据。
注释3:逻辑块一般是数据块的2幂次方倍数。
MINIX文件系统的逻辑块和数据块同等大小对于硬盘块设备,通常会划分几个分区,每个分区所存放的不同的文件系统。
硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。
分区表中得信息指明了硬盘上每个分区的类型、在硬盘中其实位置参数和结束位置参数以及占用的扇区总数。
其结构如下图1-3所示。
图1-3 硬盘设备上的分区和文件系统对于可以建立不同的多个文件系统的硬盘设备来说,minix文件系统引入超级块进行管理硬盘的文件系统结构信息。
Linux内核中的Kconfig用法与说明

Linux内核中的Kconfig文件本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读<Documentation/kbuild/kconfig-language.txt>和<Documentation/kbuild/kconfig.txt>。
内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。
通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。
1.1.1 Kconfig基本语法如程序清单0.1所示代码摘自<drivers/char/Kconfig>文件,是一个比较典型的Kconfig文件片段,包含了Kconfig的基本语法。
程序清单0.1drivers/char/Kconfig片段menu "Character devices"source "drivers/tty/Kconfig"config DEVKMEMbool "/dev/kmem virtual device support"default yhelpSay Y here if you want to support the /dev/kmem device. The/dev/kmem device is rarely used, but can be used for certainkind of kernel debugging operations.When in doubt, say "N".……endmenu1.子菜单通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。
linux 读取文件的原理

linux 读取文件的原理
Linux 读取文件的原理主要涉及到操作系统、文件系统和硬件等多个方面。
下面是一个简要的概述:
1.文件系统:Linux 系统使用的是类Unix 的文件系统,称为Ext4。
文件系统负责管理文件在硬盘上的存储和访问,以及文件的权限和属性等信息。
当一个程序试图读取一个文件时,文件系统会接收到这个请求,并查找文件在硬盘上的位置。
2.打开文件:要读取一个文件,首先需要打开这个文件。
在Linux 中,打开文件是通过系统调用(如open() 或fopen())实现的。
这些系统调用会向操作系统发出请求,请求中包含文件名和打开文件的模式(例如只读、写入等)。
操作系统会查找文件并返回一个文件描述符,这个文件描述符是一个整数,用于标识已经打开的文件。
3.读取文件数据:一旦文件被打开,就可以通过系统调用(如read() 或fread())来读取文件的内容。
这些系统调用会向操作系统发出请求,请求中包含文件描述符、读取的起始位置和要读取的字节数。
操作系统会将读取的请求传递给硬件,硬件会从硬盘中读取相应的数据,并将其存储在内存中。
4.关闭文件:当读取完文件后,需要通过系统调用(如close() 或fclose())来关闭文件。
这个系统调用会将文件描述符释放回操作系统,以便其他程序可以使用它。
linux0.01内核

linux0.01内核Linux0.01内核分析的一点心得linux(linux教程linux培训)0.01内核基本上分析完了,高版本的内核也看了一点。
有一点心得与大家分享一下吧!这里我并不打算说具体的技术方面的东西,而是针对读内核的方法,谈谈自己一点感受。
我前段时间主要看的是0.01版本的内核。
Linux0.01是Linux 的"祖师爷"Linus完成的最早的一个Linux版本,其内核编译后仅仅只有512K,麻雀虽小,五脏俱全,0.01包括了从软盘启动、文件系统、控制台管理的操作系统完整功能,并提供了不少标准的用户接口,具体有kernel, boot, fs, init,mm等几个部分,没有网络部分。
为什么选择Linux0.01?各位大虾一看到0.01肯定直摇头:哎呀,都什么时代的东东了,有看的必要么?笔者当初选择0.01并没有太多的想法,只是Tm-linux小组刚开始选择的是0.01,于是就开始读吧,现在仔细想想,读Linux0.01对于初学者来说可能更容易上手些。
可能有下面的几个好处吧1)0.01的代码量较小。
很多同学都曾有成为Linux高手的欲望,也曾抱回若干砖头书,但Linux的发展何其之快,而coder 又是黑客型高手,往往坚持不了多长时间而中途放弃!2)0.01的代码简单而精简(这个简单当然是相对于后续版本而言的)。
实际上0.01完成的就是一个操作系统的最初的要求,包括启动,进程调度,内存管理等,而这些往往与硬件结合,在看高版本的内核时往往还没有接触到这些硬件知识,层层下调已经把你搞糊涂了。
3)从低版本看更能看到技术进步的源动力,比如0.01的内核很小,其启动代码可以只放在一个扇区内,而后续版本的内核较大,无法放入一个扇区内,于是压缩核心的装入方法诞生了。
再如内存管理,0.01的内存管理比较简单,内存的申请释放直接通过使用前申请,使用后释放,但考虑以后的版本功能复杂,如何解决可能的"外碎片"问题,如何解决内存不足的问题,于是对后续版本采用的"伙伴算法",slab技术,页面守护进程有更好的理解。
Linux0.01内核源代码及注释

Bootsect.s(1-9)!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x3000 is 0x30000 bytes = 196kB, more than enough for current! versions of linux ! SYS_SIZE 是要加载的节数(16 字节为1 节)。
0x3000 共为1 2 3 4 5 60x7c000x00000x900000x100000xA0000system 模块代码执行位置线路0x90200! 0x30000 字节=192 kB(上面Linus 估算错了),对于当前的版本空间已足够了。
!SYSSIZE = 0x3000 ! 指编译连接后system 模块的大小。
参见列表1.2 中第92 的说明。
! 这里给出了一个最大默认值。
!! bootsect.s (C) 1991 Linus Torvalds!! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves! iself out of the way to address 0x90000, and jumps there.!! It then loads 'setup' directly after itself (0x90200), and the system! at 0x10000, using BIOS interrupts.!! NOTE! currently system is at most 8*65536 bytes long. This should be no! problem, even in the future. I want to keep it simple. This 512 kB! kernel size should be enough, especially as this doesn't contain the! buffer cache as in minix!! The loader has been made as simple as possible, and continuos! read errors will result in a unbreakable loop. Reboot by hand. It! loads pretty fast by getting whole sectors at a time whenever possible.!! 以下是前面这些文字的翻译:! bootsect.s (C) 1991 Linus Torvalds 版权所有!! bootsect.s 被bios-启动子程序加载至0x7c00 (31k)处,并将自己! 移到了地址0x90000 (576k)处,并跳转至那里。
linux 文件描述 0 1 2 的用法

在Linux 和类Unix 操作系统中,每个进程都有三个预定义的标准文件描述符,它们分别是:•文件描述符0 (STDIN):代表标准输入,通常关联到键盘或从其他程序接收输入的数据流。
当你运行一个命令并从键盘输入信息时,这些信息就是通过文件描述符0 提供给命令进程的。
•文件描述符1 (STDOUT):代表标准输出,它是进程正常输出数据的通道,默认情况下会显示在终端屏幕上。
例如,当你运行ls命令并列出目录内容时,这些内容就会通过文件描述符 1 输出到屏幕。
•文件描述符2 (STDERR):代表标准错误,用于输出错误信息、警告和其他非正常输出。
即使stdout 被重定向,stderr 仍然可以独立地将错误信息发送到屏幕,这样可以确保无论何种情况,错误信息都能够被用户看到。
这三种文件描述符可以用在shell 脚本编程以及命令行重定向操作中,例如:•重定向:o command > file.txt将命令的标准输出重定向到file.txt文件中,覆盖原有内容。
o command 2> error.log将命令的标准错误输出重定向到error.log文件中,同样会覆盖原文件内容。
o command > output.txt 2>&1则是将标准错误重定向到与标准输出相同的文件描述符上,这意味着标准错误也会被追加到output.txt文件中。
•管道:o command1 | command2可以将第一个命令的标准输出作为第二个命令的标准输入。
•文件描述符复制和重定向:o exec 3<&0创建一个新的文件描述符3,并使其与标准输入(文件描述符0)共享同一个输入源。
o command 2>&1将标准错误重定向至标准输出,此时两者都会输出到同一位置。
这些功能使得Linux 下的输入输出管理变得非常灵活,可以在编写脚本和处理程序输出时实现精确控制。
在linux下实现读者写者问题源代码

在linux下实现读者写者问题源代码读者写者问题是计算机科学中的一个经典同步问题,用于描述多个读者和写者对共享资源的访问。
在这个问题中,多个读者可以同时读取共享资源,但是写者在写入共享资源时必须独占访问。
在Linux下,我们可以使用线程和互斥锁来实现读者写者问题。
下面是一个简单的源代码示例:```c#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define READERS_COUNT 5#define WRITERS_COUNT 2pthread_mutex_t mutex;pthread_cond_t cond_reader, cond_writer;int readers = 0;int writers = 0;void *reader(void *arg) {int id = *(int *)arg;while (1) {pthread_mutex_lock(&mutex);while (writers > 0) {pthread_cond_wait(&cond_reader, &mutex); }readers++;pthread_mutex_unlock(&mutex);// 读取共享资源printf("Reader %d is reading\n", id);pthread_mutex_lock(&mutex);readers--;if (readers == 0) {pthread_cond_signal(&cond_writer);}pthread_mutex_unlock(&mutex);}pthread_exit(NULL);}void *writer(void *arg) {int id = *(int *)arg;while (1) {pthread_mutex_lock(&mutex);while (readers > 0 || writers > 0) {pthread_cond_wait(&cond_writer, &mutex); }writers++;pthread_mutex_unlock(&mutex);// 写入共享资源printf("Writer %d is writing\n", id);pthread_mutex_lock(&mutex);writers--;pthread_cond_signal(&cond_writer);pthread_cond_broadcast(&cond_reader);pthread_mutex_unlock(&mutex);}pthread_exit(NULL);}int main() {pthread_t readers[READERS_COUNT];pthread_t writers[WRITERS_COUNT];int reader_ids[READERS_COUNT];int writer_ids[WRITERS_COUNT];pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond_reader, NULL);pthread_cond_init(&cond_writer, NULL);// 创建读者线程for (int i = 0; i < READERS_COUNT; i++) {reader_ids[i] = i + 1;pthread_create(&readers[i], NULL, reader, &reader_ids[i]); }// 创建写者线程for (int i = 0; i < WRITERS_COUNT; i++) {writer_ids[i] = i + 1;pthread_create(&writers[i], NULL, writer, &writer_ids[i]); }// 等待线程结束for (int i = 0; i < READERS_COUNT; i++) {pthread_join(readers[i], NULL);}for (int i = 0; i < WRITERS_COUNT; i++) {pthread_join(writers[i], NULL);}pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond_reader);pthread_cond_destroy(&cond_writer);return 0;}```在这个源代码中,我们使用了互斥锁(`pthread_mutex_t`)和条件变量(`pthread_cond_t`)来实现读者写者问题的同步。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux 0.11文件系统的源码阅读总结1.minix文件系统对于linux 0.11内核的文件系统的开发,Linus主要参考了Andrew S.Tanenbaum 所写的《MINIX操作系统设计与实现》,使用的是其中的1.0版本的MINIX文件系统。
而高速缓冲区的工作原理参见M.J.Bach的《UNIX操作系统设计》第三章内容。
通过对源代码的分析,我们可以将minix文件系统分为四个部分,如下如1-1。
●高速缓冲区的管理程序。
主要实现了对硬盘等块设备进行数据高速存取的函数。
●文件系统的底层通用函数。
包括文件索引节点的管理、磁盘数据块的分配和释放以及文件名与i节点的转换算法。
●有关对文件中的数据进行读写操作的函数。
包括字符设备、块设备、管道、常规文件的读写操作,由read_write.c函数进行总调度。
●涉及到文件的系统调用接口的实现,这里主要涉及文件的打开、关闭、创建以及文件目录等系统调用,分布在namei和inode等文件中。
图1-1 文件系统四部分之间关系图1.1超级块首先我们了解一下MINIX文件系统的组成,主要包括六部分。
对于一个360K软盘,其各部分的分布如下图1-2所示:图 1-2 建有MINIX文件系统的一个360K软盘中文件系统各部分的布局示意图注释1:硬盘的一个扇区是512B,而文件系统的数据块正好是两个扇区。
注释2:引导块是计算机自动加电启动时可由ROM BIOS自动读入得执行代码和数据。
注释3:逻辑块一般是数据块的2幂次方倍数。
MINIX文件系统的逻辑块和数据块同等大小对于硬盘块设备,通常会划分几个分区,每个分区所存放的不同的文件系统。
硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。
分区表中得信息指明了硬盘上每个分区的类型、在硬盘中其实位置参数和结束位置参数以及占用的扇区总数。
其结构如下图1-3所示。
图1-3 硬盘设备上的分区和文件系统对于可以建立不同的多个文件系统的硬盘设备来说,minix文件系统引入超级块进行管理硬盘的文件系统结构信息。
其结构如下图1-4所示。
其中,s_ninodes表示设备上得i节点总数,s_nzones表示设备上的逻辑块为单位的总逻辑块数。
s_imap_blocks 和s_zmap_blocks分别表示i节点位图和逻辑块位图所占用的磁盘块数。
s_firstdatazone表示设备上数据区开始处占用的第一个逻辑块块号。
s_log_zone_size 是使用2为底的对数表示的每个逻辑块包含的磁盘块数。
对于MINIX1.0文件系统该值为0,因此其逻辑块的大小就等于磁盘块大小。
s_magic是文件系统魔幻数,用以指明文件系统的类型。
对于MINIX1.0文件系统,它的魔幻数是0x137f。
图 1-4 MINIX超级块结构对于超级块来说有两个特殊之处:●逻辑位图的最低比特位(位0)闲置不用,并在创建文件系统时会预先置1。
●I节点位图的最低比特位(位0)闲置不用,并在创建文件系统时会预先置1。
因此i节点位图只能表示8191个i节点的状况。
1.2 i节点I节点则是用来存放文件的相关信息。
对于每个文件或者目录名都有一个i节点,各自i节点结构中存放着对应文件的相关信息。
其i节点的结构(32个字节)如图1-6所示。
其中i_mode字段的是用来保存文件的类型和访问权限属性。
其15-12用于保存文件类型,为11-9保存执行文件时设置的信息,位8-0用于设置范文权限。
如图1-5所示。
I节点有一个特殊之处:●I节点0是闲置不用的,在文件系统创建时被置1。
图 1-5 i节点属性字段内容图 1-6 MINIX文件系统1.0版的i节点结构其中文件所占用得盘上逻辑块号数组结构如下图1-7所示。
图 1-7 i节点的逻辑块(区块)数组的功能1.3文件类型、属性和目录项Linux下文件属性的查看可以通过“ls –l”,具体如下图1-8所示:图 1-8 linux下“ls –l“显示的文件信息从上图可以看出来,在linux下通常可以分为六种类型的文件:●正规文件(‘-’),系统对其不做任何解释,包含有任何长度的字节流。
●目录(‘d’)在linux下也是一种文件,文件管理系统会对其内容进行解释。
●符号链接(‘s’)用于使用不同的文件名来引用另外一个文件。
分为软链接和硬链接。
软链接可以跨文件系统进行链接,删除时不会影响到源文件;而硬链接则不能跨文件系统(或者设备),它和被链接的文件地位相同,被作为一般文件对待,并且会递增文件的链接计数。
●命名管道(‘p’)文件时系统创建有名管道建立的文件,用于无关进程间的通信。
●字符设备(‘c’)文件用于以操作文件的方式访问字符设备。
主要包括tty终端、内存设备和网络设备。
●块设备(‘b’)文件用于访问硬盘、软盘等设备。
在linux下,块设备和字符设备文件一般存放在/dev目录下。
注释1:每个i节点都有一个链接计数i_nlinks,记录着指向该i节点的目录项数,这就是文件的硬链接计数。
在执行删除文件时,只有i_nlinks等于0时才允许删除此数据。
注释2:符号链接(即软链接)类型的文件并不会直接指向对应的文件的i节点,而是在其数据块中存储这一文件的路径名字符串,内核查看这个文件是通过路劲名进行直接解析的。
因此可以跨文件系统(或者设备)链接。
文件系统的目录项结构体定义在/include/linux/fs.h的头文件中,其结构如下图1-9所示。
图 1-9 目录项结构体的定义注释1:一个逻辑块能存储的目录项1024/16=64注释2:对于i节点的i_zone[0]所对应的逻辑块来说,它在初始化时首先存储了“.”(自己目录的i节点号)和“..”(父目录的i节点号)两个目录,在代码中会有体现,对目录项进行遍历时,会从2开始。
通过文件名从文件系统中获取其数据块的流程图如下图1-10所示。
图 1-10 以文件名获取其数据块1.4高速缓冲区高速缓冲区是文件系统访问块设备中数据的必经之道,它的主要作用如下:●将磁盘块中的数据预读到缓冲区,减少对磁盘的频繁访问,提高系统性能。
●当需要将数据写入到块设备时,则先将数据转存在高速缓冲区中,然后由高速缓冲区通过设备数据同步来实现写入块设备。
高速缓冲存放着最近使用过得各个块设备中的数据块。
当需要从块设备中读取数据时,缓冲管理程序首先会再高速缓冲中寻找数据。
如果在缓冲区,则直接返回数据块的指针,反之,则发出读设备的命令,将磁盘块中得数据读入高数缓冲区。
如下图1-11所示,显示了高速缓冲区位于内核模块和主内存区之间。
图 1-11 高速缓冲区在整个内存中的位置注释1:end是内核模块链接期间由链接程序ld设置的一个外部变量,内核代码中没有定义这个符号。
当在连接生成system模块时,ld程序设置了end的地址,它等于data_start+datasize+bss_size,即bss段结束后的第一个有效地址。
注释2:高速缓冲区被划分为1024字节大小的缓冲块,正好与块设备上的磁盘逻辑块大小相同。
高速缓冲区从物理角度看主要由缓冲块和指向缓冲块的缓冲头组成。
其中缓冲头的结构体为:struct buffer_head {char * b_data; //指向该缓冲块中数据区(1024字节)的指针unsigned long b_blocknr; //块号unsigned short b_dev; //数据块的设备号unsigned char b_uptodate; //更新标志,表示设备是否更新unsigned char b_dirt; //修改标志,0-未修改,1-已修改unsigned char b_count; //使用该块的用户数,用于清除数据块时。
unsigned char b_lock; //缓冲区上所标识,0-ok,1-lockedstruct task_struct * b_wait; //指向等待使用此缓冲块的进程struct buffer_head * b_prev; //hash队列上一块struct buffer_head * b_next; //hash队列下一块struct buffer_head * b_prev_free; //空闲表上一块struct buffer_head * b_next_free; //空闲表下一块};注释1:字段b_dirt是脏标志,说明该缓冲块中得内容是否已修改而与块设备上得对应数据块内容不同(延迟写)。
B_uptodate是数据更新标志,说明缓冲块中数据是否有效。
初始化或者释放块时这两个标志设置为0,表示该缓冲块此时无效。
注释2:b_dirt=1,b_uptodate=0,数据被写入缓冲块但是还没有被写入设备;b_dirt=0,b_uptodate=1,数据被写入了设备块或者刚从设备快中读入缓冲块中变成有效;b_dirt=1,b_uptodate=1,表示缓冲块和设备快上得数据不同,但是数据还是有效的(更新的)。
高速缓冲区采用hash表和空闲缓冲块队列进行操作管理,这也是高速缓冲区从逻辑上的组成。
在缓冲区初始化过程中,初始化程序从整个缓冲区的两端开始,分别同时设置缓冲头块和划分对应的缓冲块,如图1-12所示。
缓冲头的结构体描述了对应缓冲块的属性,并且用于把所有的缓冲头连接成一个双向链表结构。
如图1-13所示。
图 1-12 高速缓冲区的初始化示意图注释1:高端建立了1024大小的缓冲块,低端建立了对应的缓冲块头图 1-13 所有缓冲块组成的双向循环链表结构注释1:free_list指针是该链表的头指针,指向空闲块链表中第一个“最为空闲的”缓冲块,即近期最少使用的块。
为了能够快速而有效地在缓冲区中寻找判断出请求的数据块是否已经被读入缓冲区中,buffer.c使用了具有307个buffer_head指针项的hash数组结构。
Hash函数采用了设备号和逻辑块号作为参数,具体函数:(设备号^逻辑块号)Mod307。
然后通过b_prev、p_next将hash表中散列在同一项上的多个缓冲块练成一个双向链表。
通过hash数组实现管理缓冲块的好处是保证了同一设备号的块具有相同的散列值,加速对缓冲区中得块的查询。
图1-14所示为某一时刻内核中缓冲块散列队列示意图。
图1-14 某一刻内核中缓冲块散列队列示意图2源码分析这一部分主要从源码fs/目录下的各个文件进行逐个分析,理清它们之间的调用关系,并通过流程图的形式展现其中关键代码的实现。
本章可以划分为五大部分:1)高速缓冲管理;2)文件底层操作;3)文件数据访问;4)文件高层访问控制;5)文件系统的初始化和define变量说明。
2.1高速缓冲管理高速缓冲管理在fs/buffer.c中得到实现。