四。Linux内核源代码情景分析
1预备知识
1.1linux内核简介
linux发展史
linux源代码组成
linux内核版和发行版的命名方式
1.2 Intelx86的寻址方式
早期8086和8088处理器是16位,寻址方式为实模式,后来随着技术的发展,人们意识到实模式的不足(完全把计算机暴露在用户的眼皮下),就产生了保护模式,关于这两点的区别,主要在于对内存的访问是否有进行保护,主要是越界和越权。越界就是用户不能访问的地址范围不允许访问,用户没有权限的地址范围不能访问。所以早期计算机工作者们就在建立了段式内存管理,把内存地址进行分段(比如,16段,每段大小64k,刚好1M)然后cpu中设置了四个段寄存器:CS,DS,SS,ES,分别用于可执行代码的指令,数据,堆栈,其他。由于早期intel内存大小采用1M,而cpu确实16位,如果不做一定额处理,16位总线是不能访问超过64k的范围,所以每个段寄存器的内容作为内存地址的高16位,同时与段内偏移地址作为低16进行相加(重叠12位),这样就刚好形成了20位的内存地址,即1M。
由于这种管理机制无法提供对内存的保护,所以基于段式内存管理机制,到后来的386以后,人们采用保护模式,并且数据总线为32位了,人们在原来的四个段寄存器的基础上加上两个段寄存器FS,GS,为了实现保护模式的作用。所以数据总线的地址内容应该有如下设计思想
1根据指令的性质来确定应该使用哪个段寄存器
2根据段寄存器的内容,找到相应的地址段描述结构
3根据地址段描述结构得到基地址
4将指令发出的地址作为位移,与段描述结构中规定的段长度比较,是否越界
5根据地址段描述结构符中的访问权限来确定是否越权
6将指令发出的地址作为位移,与基地址相加得出实际的物理地址。
上面就是保护模式下段式内存管理的设计思想,下面就是实现过程。
1段寄存器,由于段地址描述结构栈8个字节,故地址为8的整数倍,所以段寄存器低三位可以用于其他作用。
2段地址描述结构(GDTR,LDTR),其数据的主要作用在于描述基地址,权限,范围。
通过上面的段寄存器映射到过渡的段地址描述结构,最后就是指令发出的地址与段地址描述结构提供的基地址来映射到最后的物理地址了(前提是没有采用分页内存管理)
1.3 i386页式管理机制
由于段式管理机制是实实在在的,没有抽象出来,不方便内存管理,人们就又在段式管理的基础上增加了分页式管理,从而由虚拟地址经过段式管理映射得到的地址不再是物理地址了,人们称为线性地址,在线性地址的基础上经过页面映射后得到的才是真正的物理地址。
在分页机制中,线性地址的结构被人为的划分为
而整个页面映射的过程为