品评Minix源码--1,全局头文件
- 格式:doc
- 大小:145.00 KB
- 文档页数:27
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文件系统引入超级块进行管理硬盘的文件系统结构信息。
Minix 系统核心数据结构及核心操作分析华中科技大学计算机学院 计算机系统结构 张寅摘要:本文主要以Minix 操作系统为例介绍有关操作系统的关键数据结构以及相关的操作。
主要涉及Minix 的内核、进程结构及管理、存储管理、文件系统几个方面。
通过对其的分析,能够较好的理解操作系统的实现原理。
关键字:Minix 核心,操作系统,核心分析1.Minix 进程1.1 Minix 内部结构首先大致了解一下Minix3的整体结构。
Minix3被组织成四层,每一层都有一套定义明确的功能模块。
如下图所示。
本节关心Minix 的内核和进程管理器,文件系统模块在后续小节会介绍。
其他模块不作介绍,读者可以参考相关书籍。
图1.1 Minix3的四层结构Minix3的进程管理主要由进程管理器(Process Manager ,PM )来实现。
而像进程调度等进程重要相关的管理功能交由内核来管理。
Minix3把进程管理分开实现可能是为了实现微内核结构。
在这里,把Minix 的内核相关结构和操作归入进程管理来一起论述。
后面可以看到,进程管理器还包括的存储管理功能,因此在Minix 存储管理部分还要介绍进程管理器。
1.2 Minix 内核内核进行最底层的进程调度,负责进程在就绪态、运行态、阻塞态之间的转换。
内核还会处理所有进程间的消息。
出内核本身外,内核层还包括类似设备驱动的功能模块:时钟任务、系统任务。
尽管时钟任务和系统被编译进了内核地址空间,但它们作为单独的进程调度,并用自己的堆栈。
大部分内核程序和所有的时钟任务及系统任务由C 语言编写。
汇编语言编用户进程内核 设备驱动程序服务器进程写的部分负责中断处理、进程切换的底层上下文管理、MMU硬件的底层操作。
下面介绍时钟任务和系统任务,因为这两者为内核提供基本支持。
时钟(定时器)是任何分时系统运行所必需的。
系统时钟由硬件定时器产生。
定时器每计数完一次,便产生一个硬件中断,这称为一个系统滴答,然后再由时钟中断处理程序处理相关操作。
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文件系统引入超级块进行管理硬盘的文件系统结构信息。
Minix进程实现2.5~2.6概述:本部分内容主要从两个部分介绍进程在Minix中的实现的:第一部分是介绍整个Minix的系统结构的,其中包括了Minix的内部结构以及各种头文件,其主要是对于各个头文件以及进程有关的数据结构的介绍的;第二部分讲的是Minix中进程的实现,其中包括Minix的系统初始化、中断处理、进程间的通信和进程调度。
Minix系统结构介绍:包括Minix内部结构以及各种头文件。
Minix内部四层结构最底层捕获所有的中断和陷入,完成进程调度,并向高层提供一个采用消息进行通信的独立顺序进程模型。
包含完成以下功能的函数:系统初始化、中断、消息传递以及进程调度。
第二层包括了I/O进程,每类设备都有一个I/O进程,我们称之为任务(task)。
只有一个任务,即系统任务与众不同,它不对应于任何I/O设备。
第三层包含向用户进程提供有用服务的进程。
这些服务器进程在低于内核和任务的特权级上运行,不能直接访问I/O端口,也不能访问属于自己段以外的内存。
第四层包含了所有的用户进程——shell、编译器、编辑器以及用户的a.out 程序。
Minix四层结构之间的联系:操作系统主要完成的两件事情:管理资源和通过系统调用方式提供扩展的计算机。
其中,资源管理主要是在内核(第一、二层)完成的,系统调用的解释在第三层。
第三层的各种服务进程被单独的设计成“服务器”,这样可以增加整个系统的可扩展性。
如果要是加入一个新的服务器进程,需要重新编译内核。
Minix源代码的组织源代码从逻辑上分成两个目录:/usr/include/和/usr/src/,记做:include/和/src/。
include/目录包含了许多符合POSIX标准的头文件,它又包含了三个子目录:1.sys/ 包含POSIX头文件2.minix/ 包含操作系统使用的头文件3.ibm/ 包含IBMPC特有定义的头文件。
src/目录包含了三个重要的子目录,其中包括了操作系统的源代码1.kernel/ 第一层和第二层的(进程、消息和驱动程序)2.mm/ 内存管理器代码3.fs/ 文件系统代码公共头文件其中,编译用户程序时可能用到的头文件放在include/目录下,而传统上include/sys/目录放那些编译系统程序和程序所用的头文件。
minix3内核代码注释minix3内核代码注释----ipc分析2007-09-15 17:57:54分类:IPC是在内核最底层实现的,它的重要性不言而喻,下面试着分析minix3的ipc实现。
在include/minix/ipc.h中可以看到message结构体的定义七种不同的消息内容格式如下:(在386平台下,int为32位short为16位 long为32位指针为32位)在include/minix/ipc.h中可以看到函数的声明*m_ptr));_PROTOTYPE(int notify,(int dest));_PROTOTYPE(int sendrec,(int src_dest,message *m_ptr));_PROTOTYPE(int receive,(int src,message *m_ptr));_PROTOTYPE(int send,(int dest,message *m_ptr));//一组API#define ipc_request _ipc_request#define ipc_reply _ipc_reply#define ipc_notify _ipc_notify#define ipc_select _ipc_select_PROTOTYPE(int ipc_request,(int dst,message *m_ptr));_PROTOTYPE(int ipc_reply,(int dst,message *m_ptr));_PROTOTYPE(int ipc_notify,(int dst,long event_set));_PROTOTYPE(int ipc_receive,(int src,long events,message *m_ptr));//另外一组API 没有发现实现的代码#endif/* _IPC_H */以上IPC API函数的实现均是通过int指令trap调用系统调用以_send的代码为例,其余都大体类似以上IPC函数都是通过int SYSVEC 实现不过对应的ecx值是不同的mpx386.s中的_s_call代码如下push ebp!stack already points into proc tablepush esipush edio16 push dso16 push eso16 push fso16 push gsmov si,ss!ss is kernel data segmentmov ds,si!load rest of kernel segmentsmov es,si!kernel does not use fs,gsincb (_k_reenter)! increment kernel entry countmov esi, esp ! assumes P_STACKBASE == 0mov esp, k_stktopxor ebp,ebp!for stacktrace! end of inline save!now set up parameters for sys_call()push edx!event set or flags bit mappush ebx! pointer to user messagepush eax! source / destinationsys_call()的核心部分如下:且通过sys_call()函数可以看出ipc_系列的API都没有实现。
minix操作系统设计与实践概述及解释说明1. 引言1.1 概述引言部分将对整篇长文进行简要概述,并介绍文章的结构和目的。
本文将讨论MINIX操作系统的设计与实践,包括MINIX的概述、设计原则以及实践应用等方面内容。
同时,我们还会对MINIX的内核架构进行详细分析,包括内核组成部分、进程管理子系统以及文件系统子系统等。
此外,我们也会介绍MINIX的用户界面和工具集,包括用户界面概述、Shell命令解析器以及编译和调试工具链等内容。
最后,文章将以总结和展望作为结尾。
1.2 文章结构本文共分为五个部分:引言、MINIX操作系统设计与实践、MINIX内核架构分析、MINIX用户界面和工具集介绍以及结论。
其中,引言部分主要是对全文进行简要概述,并介绍了每个部分的内容安排。
1.3 目的本文旨在深入了解和解释MINIX操作系统的设计与实践,并对其各个方面进行详细探讨。
通过对MINIX操作系统的研究,在学术领域中推动操作系统领域的发展,并为读者提供一个全面了解MINIX操作系统的参考资料。
此外,通过对MINIX内核架构和用户界面工具集的分析,读者将能够更好地掌握操作系统的设计原则和实践应用,从而为自己的研究和开发工作提供有益指导。
以上是引言部分的内容,主要包括概述、文章结构和目的三个方面的说明。
希望能够清晰明了地介绍本文的主题和内容安排,以吸引读者继续阅读。
2. MINIX操作系统设计与实践:2.1 MINIX概述:MINIX是一个小型的Unix-like操作系统,由Andrew S. Tanenbaum 教授在1987年首次发布。
它的名称“MINIX”代表“Minimal Unix”,这意味着它被设计成轻量级且具有最基本的功能。
MINIX旨在用于教学目的,并作为学生了解操作系统原理和实践的工具。
2.2 MINIX设计原则:MINIX的设计遵循几个关键原则。
首先,它被设计成非常模块化和可扩展的,使得内核中的各个功能模块可以独立开发、测试和维护。
Minix源码解读报告学号:5100309002姓名:邢佳楠以下是我这学期主要阅读过的minix源码内容,主要从几个比较重点的系统调用的实现入手,阅读的足迹涉及KERNEL、PM、VM、VFS和一点PFS:一、系统的初始化进程:系统启动后,系统将提示选择多个image中一个进行处理。
选择映像后,系统进入pre_init() (kernel/arch/i386/pre_init.c) ,做一些开机准备,之后,完成一些参数的设置,读入相应选择的映像。
pre_init() 完成后,进入mpx.S 中的kernel_init 下的汇编代码。
之后进入main() (kernel/main.c) 函数。
在main中:(1) 初始化进程表,标记为空。
进程结构proc 在kernel/proc.h 中定义。
(2) 初始化特权表。
亦标记为空。
特权表记录了进程对应的能够执行的命令,如能够使用的内存范围,能够使用的I/O 地址,所使用的信号管理器,能够使用Kernel_call 的权限等等。
关于特权的配置,可以看include/minix/priv.h 其中的常量(3)初始化boot image所提供的一些默认的进程。
按照先后次序一一进行初始化,将他们放进进程表中(复制数据),如果进程是IDLE, CLOCK, SYSTEM,或者根系统进程(即再生服务器),那么他们当前可被调度,否则,初始不应该被调度。
对于再生服务器进程,作为系统进程且可以被抢占(这是所有系统服务的共性),另外,设置允许陷入等等。
对于其它进程,暂时不允许运行。
(4)之后设置堆栈,内存映像,将proc_ptr 指向当前进程,清除标记,入队,设置为可调度状态,开始调度。
(5)初始化中断、System Call数组等等二、IPC的实现:在上一层,由库函数产生中断进入到kernel 中(lib/libc/arch/ui386/rts/_ipc.S),具体没看,相关头文件主要是include/minix/ipc.h定义,在这个头文件里定义了9 种消息类型以及IPC 函数原型。
Minix操作系统内核源代码概要分析版本号:0.01(2004-5-28更新)作者:guokun email:guo_kun@ 第一部分 PC外围设备的相关分析.第二部分总体结构分析第三部分头文件及数据结构分析第四部分 kernel代码分析第五部分内存管理器的分析第六部分文件系统分析第七部分总结第一部分 PC外围设备的相关分析.●处理器复位后的状态分析●处理器的体系结构分析●硬盘Winchester硬盘结构分类分区表 Io端口地址硬盘控制器●软盘软盘结构分区表马达控制软盘控制器●时钟(PT)8253●实时时钟(RT)●总线时钟●可编程中断控制器8259A(PIC)●显示卡 6845-→vram→frame Buffer●串口●并口 8255●DMA控制器8237 基地址,控制字●键盘 8248●ISA 总线 ISA 端口的地址范围●PCI 总线 PCI IO/ MEM/ Configure第二部分总体结构分析总体结构分析概论源代码结构分解为树形结构。
如下所示:源代码总体组织结构.sys/ibm/include/ minix/net/...kernel/mm/fs/src/ boot/inet/tools/test/etc/lib/第三部分头文件及数据结构分析头文件详细分析include 目录结构include/a.out.hinclude/ansi.hinclude/errno.hinclude/fcntl.hinclude/ibm/partition.hinclude/limits.hinclude/minix/boot.hinclude/minix/callnr.hinclude/minix/com.hinclude/minix/config.hinclude/minix/const.hinclude/minix/keymap.hinclude/minix/partition.hinclude/minix/syslib.hinclude/minix/type.hinclude/signal.hinclude/stdlib.hinclude/string.hinclude/sys/dir.hinclude/sys/ioctl.hinclude/sys/ptrtrace.hinclude/sys/sigcontext.hinclude/sys/stat.hinclude/sys/types.hinclude/sys/wait.hinclude/termios.hinclude/unistd.hinclude/terminos.hinclude/ansi.h这个文件检测这个编译器是不是基于ANSI的编译器。
MINIX, EXT2,FAT文件系统概要分析关键词:MINIX EXT2FAT FAT32分析Title: 概述了MINIX,EXT2,FAT文件系统,看完应该有一个全局的了解Author: QuanDate: 18.04.2006====================MINIX:====================Minix的文件系统主要包括一下6个部分:引导块,超级块,i节点位图,区段位图,真正的i节点信息,数据。
引导块:一般来将,每一个文件分区里面,都必须包含一个引导块。
虽然并不是每一个设备的分区都是用来引导的,但是,出于结构的统一以及兼容性方面的考虑,一般文件系统需要将分区的第一个块保留为引导块。
因此,我以前曾经犯过的一个错误就是,认为启动盘在windows里面是不能够被识别的,会提示磁盘未格式化。
看来我真的是错了,只能将那个启动盘上的系统,windows不能够识别。
但是,启动盘里面确实也装载着完整的文件系统。
超级块:之所以称之为超级块,就是因为这个块是整个文件系统的龙头!从它,可以推算出整个文件系统的信息。
在minix中,它包含了i节点数,区段数,块/区段比,最大文件长度,magic number等等信息。
这样,整个文件系统中,上面所涉及到的6个部分的分布就清楚了。
位图:常用的一个数据结构。
使用一个bit来代表一个有序逻辑单位,如这里的一个i节点,一个区段,或者是内存中的一页等等。
这里,使用位图来表示哪些i节点是可以的或者是不可用的,对于区段的使用方式也是相同的。
这样,就是对有序的逻辑单位进行了标记,而且这样的标记是写入磁盘的因此可以长期的保存。
所以,必须要确保文件系统的一致性(consistency),因为标记和真正的逻辑单位并不是同时写入磁盘的。
这一点,相当的重要。
i节点:这个结构和UNIX下的文件系统应该说是一样的。
这里保存着对应于每个文件的具体的信息,如文件类型,访问权限,链接信息,文件大小,时间信息,区段号(包括一次间接块和二次间接块)等等与文件密切相关的信息。
Minix引导过程分析由于Minix引导过程不属于操作系统,《操作系统设计与实现》一书中没有对其进行详细的分析和说明。
Andrew Swartzbaugh 和Brent Johnson 的网站对引导过程所涉及的六个代码文件进行了详细的分析。
我觉得有必要对其进行一些翻译,以利于进一步的学习。
正如网站上说的,通过阅读6个文件的代码,不仅可以了解Minix的引导过程,而且对于理解操作系统中的汇编语言也很有帮助。
本文的代码来自Minix当前的最新版本2.0.4。
其中一些部分与2.0.0版有所不同。
当系统启动时,硬件将软盘或硬盘的第一个扇区载入到内存的LOADOFF位置,这实际上是ROM BIOS的工作,与操作系统无关。
对于Minix,第一次载入的程序可能是masterboot.s 或者bootblock.s。
对于有分区的硬盘,它的第一个扇区是MBR(master boot record),其中包含有代码和分区表。
如果分区里有子分区,则在分区的第一个扇区也有MBR。
MBR也可以被拷贝到软盘的第一个扇区。
masterboot.s 就存放在MBR中。
如果masterboot.s 被载入,它的任务就是找到引导分区(或软盘),从而加载该分区(或软盘)的第一个扇区并跳转至该处运行。
在引导分区或软盘的第一个扇区存放有Minix的初级引导程序,即bootblock.s。
它同样是被加载到LOADOFF位置,它的任务是将boot monitor(Minix的次级引导程序)加载到内存,并将控制转给boot monitor。
boot monitor由(boothead.s,boot.c,bootimage.c,rawfs.c)四个文件组成。
boot monitor的主要任务是加载Minix或其他操作系统。
boothead.s是boot monitor的入口,并提供一些底层支持(主要是调用BIOS中断)。
当bootblock.s跳转到boot monitor,boothead的代码就开始执行。
这些代码确定内存布局,处理器类型(286,386,486等),当前显示模式以及被加载的设备,并最终调用函数boot() (在boot.c中)。
boothead.s还提供了退出monior,确定设备参数,在盘中读写数据,从键盘和屏幕读写字符的函数。
跳转到Minix的代码(包括从实模式转到保护模式)也在boothead.s中。
boot.c提供monitor中的高层函数。
其中最高层的是boot()。
boot() 调用函数initialize() (同样在boot.c中)。
initialize()转移boot monitor并将它从传递给内核的内存表中删去(以防内核覆盖boot monitor)。
boot()接下来调用下列函数:1) get_parameters()(在boot.c中)设置一些环境变量和函数并从bootparams扇区(引导分区的第二个扇区)中读取一些参数的值。
2) r_super()(在rawfs.c中)证实系统是minix文件系统并确定文件系统的参数。
在这两个函数返回后系统将执行用户输入的命令,其中最重要的命令是boot。
bootimage.c的主要函数是bootminix(),当用户输入boot命令时将调用此函数。
bootminix()调用下列函数:1) select_image()在盘中找到所需的内核镜像。
2) exec_image()将内核镜像加载到内存,然后调用minix()(在boothead.s)转到保护模式(如果内核在保护模式中编译)并跳至内核。
当操作系统返回boot monitor时(如用户使用shutdown命令),bootminix()返回。
以上的文件都存放在/usr/src/boot文件夹中。
该文件夹中还有一些提供辅助功能的函数:如果内核镜像所在的硬盘存在minix文件系统,在引导过程中必定要涉及文件系统的相关操作。
在操作系统的文件系统模块还无法使用的情况下,引导程序必须提供一系列函数以实现对文件系统的操作。
这些函数被集中放在rawfs.c 中。
installboot.c 不属于引导程序。
它的功能是将引导程序和内核写入磁盘并使其可引导。
品评Minix源码--1,全局头文件下面先来了解一下Minix的头文件都是干嘛的,以此来了解Minix是怎样一个架构的。
分析的源码是《操作系统设计与实现》下册的代码,也就是著名的AppendixB。
分析源码的工作是在FreeBSD 6.0下进行的,使用Source-Navigator来分析。
这些头文件不全,但都是必要的东西。
1.整体结构:头文件目录结构为:包含用户程序使用的头文件:include包含IBMPC特有定义的头文件:includeibm包含操作系统使用的头文件:includeminix包含POSIX头文件,一般给编译程序用的:includesys2.详细功能(按照代码在书本中出现的顺序)2.1.include00000: ansi.h是编译Minix系统每个都要包含的头文件。
用来测试编译器是否符合ANSI标准。
最重要的宏是_PROTOTYPE,声明函数都用这个。
声明函数的格式为:_PROTOTYPE(int close, (int _fd));00100:limits.h间接包含在每个Minix源文件中,是一些数据类型的基本大小的定义,还有诸如最大link数目,最大参数个数,文件名最长为多少个字符等限制。
00200:errno.h最重要的是全局变量errno,用来放错误号的。
该头文件定义了一系列的错误类型。
有特色的东西就是,如果定义了_SYSTEM,就定义 _SIGN为负号,如果没有定义_SYSTEM,就定义_SIGN为空。
然后错误码定义为:#define EMFILE (_SIGN 24)。
在定义一系列错误码前,还先定义了错误码的数量。
00400:unistd.h声明了Unix-like系统的N多系统调用,比如unlink, brk, chown等,声明中的参数命名规范都是以下划线开头的,比如:_path;还有定义了一些常量,有这么几类:1.access()使用的F_OK, X_OK, W_OK, R_OK,也就是检查权限的东东。
2.lseek()使用的SEEK_SET, SEEK_CUR, SEEK_END3.遵循的POSIX版本号4.STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO,看名字就知道是干嘛的了。
5.如果退出系统的:RBT_HALT, RBT_REBOOT, RBT_PANIC, RBT_REST, RBT_MONITOR6.定义了NULL7.POSIX相关的变量00600:string.h包含字符串操作的C函数的原型。
00700:signal.h定义标准信号名,比如:SIGHUP, SIGINT, SIGTERM等。
还有C语言中信号库的函数原型。
信号处理涉及到Minix的所有部分!00900:fcntl.h主要由文件系统引用。
包含了creat, open, fcntl系统调用的原型,还有一系列的参数和flag,比如:O_CREAT, O_EXCL,O_RDONLY等。
01000:stdlib.h用户程序使用最频繁的头文件。
C的“有用”的函数的原型还有一些常量,类型的定义,比如size_t。
01100:terrnios.h操作系统控制台跟终端接口是很复杂的。
所以要有个标准,让不同硬件能跟操作系统和用户交互。
这个文件就干这些事情。
它定义了控制终端类型的I/O 设备要用到的常量,宏和函数原型,最重要的是terrnios 结构,包含的内容有:标识各种操作模式的标志位,设置输入输出频率的变量和放置特殊字符的数组。
这个文件定义的东西多数是POSIX需要的。
但后面它也定义了一些MINIX自己扩展的东西,比如定义57600或以上的波特率。
01400:a.out.h定义可执行文件在磁盘的存储格式。
包括文件启动的文件头和符号表。
(有个疑问,Minix不用elf?)2.2.include/sys01600:types.h良好的编程素养包括typedef自己的数据类型。
这个文件中的数据类型都是以_t结尾的,比如ino_t, dev_t 等。
比较好的定义有8位无符号类型用unsigned char,16位无符号用unsigned short, 32位无符号用unsigned long。
这个文件后面还定义了信号处理的函数指针。
01800:ioctl.h定义了很多设备控制的宏,主要是I/O设备。
不过我还是不大理解它跟terrnios.h的分工。
02000:sigcontext.h用于内核的内存管理器。
定义一些用来在信号处理前后保存和恢复系统操作的结构。
02200:ptrace.h定义了ptrace系统调用的一些东东。
ptrace是用来“process tracing and debugging(freebsd的man说的)”的,可以让一个进程控制另外一个进程。
02300:stat.h定义了stat()和fstat()函数返回的结构,用来操作文件的。
也定义了一些文件其他的文件状态,比如权限之类的。
主要用于内存管理和文件系统上。
定义了chmod, fstat, mkdir, mkfifo, stat, umask这些函数的原型。
02400:dir.h定义了目录项结构。
02500:wait.h定义了wait()和waitpid()系统调用相关的东东。
在内存管理中实现。
2.3. include/minix02600:config.h这个头文件就厉害啦,通过配置它,能使minix在不同体系架构的机器上被编译。
它分为2部分:1.用户设置参数,比如MACHINE是IBM_PC还是SUN_4等;2.非用户配置参数,比如定义了芯片类型等。
02900:const.h为了使常量定义一致而搞的头文件。
当然, kernel,mm他们都有自己local的const,而跨区域的const 就得包括这个minix/const.h。
它包含了一些掩码,比如BYTE:0377;一些宏,比如:MAX(a, b);内存单元的大小, CLICK_SIZE;还有TRUE, FALSE等。
03100:type.h相当重要的东西。
因为它包含了message的结构的定义,这个结构定义得很巧,以后再展开分析。
03300:syslib.h包含操作系统内部调用以访问操作系统其他服务的C库函数的原型。
很扰口,以后就懂了。
03400:callnr.h定义minix系统调用的序号。
它在前面的部分也限制了系统调用的个数,定义NCALLS,为77个。