0. 前言
本文档主要记录了项目的目录结构,以及每个目录下文件的功能。文件很多,一开始不必胡子眉毛一把抓,笔者根据自己的经验列出了需要重点关注的文件与阅读顺序,供读者参考。
linux-0.11作为一个完整的操作系统,主要实现了以下几方面的基本功能:
- 文件系统(在fs文件夹中)
- 内存管理(在mm文件夹中)
- 进程管理和调度(在kernel文件夹中)
- 设备管理(在kernel文件夹中)
其他还有如启动(boot),初始化(init),系统调用(lib)等功能。
如果想要详细了解其全貌,推荐阅读材料与顺序如下
- 闪客微信公众号: 你管这破玩意叫操作系统源码 | 第一回 最开始的两行代码 (qq.com)
特点是图片较多,语言通俗易懂,据说文科生也能看,方便入门,了解一般的启动流程和程序调度过程
- 新设计团队: 《Linux内核设计的意图》
同样是图解为主,配上一些简明扼要的文字说明,就算不看源代码,也能掌握操作系统的整体脉络;但是更加科学,更加详尽,而且有实际的程序例子详解应用层程序的工作流程
- 赵炯老师: 《Linux内核完全注释》(内核版本0.11)
极为详细的代码注释,适合深入研究;缺点是如果一开始没有操作系统的流程概念,只是从前往后阅读会抓不住重点
1. boot
阅读本文件夹需要有汇编基础,里面的三个.s文件跟操作系统代码在内存上的加载有关,并做了初步的内存规划
2. fs
本文件夹主要涉及文件相关的操作
- 文件在硬盘和内存中的组织结构,包含bitmap.c, super.c, inode.c, block_dev.c, file_dev.c file_table.c,namei.c等.
这一部分内容需要优先了解。linux-0.11主要靠inode结构管理硬盘信息,并提供给文件存储文件信息。inode->block(硬盘中的块)
filep(文件描述符)->file_table(文件表)->file(文件的元信息)->inode_table->inode
- 文件状态管理,包含fcntl.c, ioctl.c, stat.c等
- 文件开关,包含openc.c等
- 文件读写, 包含read_write.c等
- 其他,包括super.c(超级块管理), exec.c(程序执行,不明白为啥要放在这个文件夹里), pipe.c(管道)等
3. include
所有头文件所在,一开始的时候就需要阅读其中的关键若干文件,等到一段时间后,对操作系统有了初步的概念,再进行通读。比较重要的头文件如下
- fs.h
inode结构必须清清楚楚,是一切文件管理实现的核心; 超级块也要了解,系统通过超级块的方法管理磁盘;buffer_head是缓冲区头数据结构,极为重要
- sched.h
其中有两个最重要的结构体,task_struct(任务(进程/线程)数据结构,结构体变量非常多,一开始全部搞懂,需要不断的回看), tss_struct(任务状态段,用于任务切换时保存上下文,内部有很多寄存器信息)
如果此处有疑问,建议先了解计算机组成特别是寄存器相关的知识,推荐王爽老师的《汇编语言》
- a.out.h
主要是执行文件结构相关的数据和函数,需要不错的C语言基础
推荐布莱恩特老师的《CSAPP》
- unistd.h
一些常用的标准库函数,知道其含义即可,一般C语言的开发者会比较熟悉,不用细看
4. init
只有一个main.c文件,是程序的主流程,用于环境初始化。
在此文件中初始化了4个进程
- 进程0:初始化内存布局,设备,时间,硬盘,特权级翻转等
- 进程1:文件系统初始化,文件交互功能初始化
- 进程2:加载配置文件(/etc/rc)并退出
- 进程3:初始化shell程序
5. kernel
6. lib
7. mm
8. tools