这篇文章概要地把整个LINUX系统(0.11)串起来。部分图片来自于《Linux内核完全注释》一书,版权归原作者所有。另,以下总结,纯属个人观点,并不一定是对的,欢迎指正。
零. 总括
LINUX 系统总的来说分为几部分管理,即内存,进程,文件系统,中断,进程通信,网络接口
一. 硬件
Linux 0.11是基于80386系统芯片的。所以寄存器信息如下
http://blog.youkuaiyun.com/yunsongice/archive/2010/10/04/5921873.aspx
个人觉得,对操作系统理解,首先要清楚我们有什么样的硬件,这些硬件提供什么样的功能。
CPU:取指令(CS+IP。根据设置,可能运行于实模式,即物理=CS*16+IP。也可能是保护模式,即CS里可能是段描述符,需要进行虚->线性的转换。另外,当开启了分页机制时,还需要线性->物理的转换) + 执行指令(当CS或IP值有变化时,通过上面所说的步骤,取到正确的指令,并执行)
二. 内存管理
1. 三个重要概念
虚拟地址:CS+IP中的就是虚拟地址(这样说未必很准确,不过可以让我们有个概念)
线性地址: 开启段保护后,CS中存入的是描述符,由段描述符得到段基址,加上偏移,得到线性地址。
物理地址: 真正的内存地址。当没有开启分页时,线性地址就是物理地址。当开启分页时,分割为4K一页,采用二级目录形式(传说中这样比较省空间,因为二级目录是可以动态分配的)。由于线性到物理的映射是由所有任务共有(采用同样的映射方法),所以段映射时得到的线性地址不可以重合(理论上,但其实有的会故意重合)。
2. 映射
涉及到GDT,LDT, CR3等等。
GDT指向全局描述符表,为所有任务共有。其中,内核数据段,代码段的描述符放在里面 + TSS + 任务的LDT表
LDT指向局部表,每个任务有自己的LDT。
个人觉得GDT和LDT映射出来的线性空间是不重叠的。
上图描述了三种地址的关系
3. 线性内存的分配
前16M用于内核,包括内核所有代码、内核段表(GDT,IDT,TSS)、页目录表和内核二级页表、内核局部数据及临时堆栈。而且其线性地址与物理地址应是一一对应的。这样GDTR指向的就是GDT的地址了。
4. 物理内存的分配