最近借整理ARM/MIPS/X86系列文章之际,对x86体系架构进行了有针对性的学习。联系到大学课程《微机原理与接口技术》,将这次学习的一些心得,收获整理如下。
温故知新
为什么要重新学习x86体系架构呢?在大学期间,学习过《微机原理与接口技术》,课程主要是以8086处理器为例,x86处理器(也就是i386处理器,包括从刚开始的80286,80386,奔腾系列,一直到现在的intel处理器)知识都没有涉及。只有8086处理器的知识,对理解操作系统内存管理原理,编译和链接,C语言运行等造成很大的困惑。
下面主要认识一下CPU中的 内存寻址 和 虚拟内存 。
内存寻址-实模式/保护模式
x86的内存寻址有两种模式,实模式和保护模式。实模式就是8086中的内存寻址模式,段寄存器左移4位+段基址寄存器的方式。在现在PC上,只有上电时很短的时候CPU工作在实模式,操作系统会很快将CPU切换到保护模式下工作。理解保护模式,也是理解OS内存管理等的基础。
分段机制
因为使用页机制的原因,通过段机制转换得到的地址仅仅是作为一个中间地址――线性地址了,该地址不代表实际物理地址,而是代表整个进程的虚拟空间地址。
虚拟内存技术
虚拟内存技术就是一种由操作系统接管的按需动态内存分配方法。如果说内存寻址是处理器架构要解决的问题(由硬件设计解决),那么虚拟内存就是OS和处理器架构需要共同解决的问题(主要由OS内存管理模块和处理器中的MMU一起解决)。
虚拟内存机制的特点:
- 程序代码中访问的不再是物理地址,而是虚拟地址。例如32位的系统,每个进程有4GB的虚拟地址空间;
- 每个进程中有一个表,记录着每个虚拟地址对应的物理地址;
- 程序加载的时候,可以先分配号物理内存,然后把物理内存的地址填入这个表中;
Linux的swap分区就是硬盘专门为虚拟存储空间预留的空间。经验大小应该是内存的两倍左右。有兴趣的话可以使用 swapon -s 查看交换分区大小,还可以用vmstat 查看当前每秒换入换出的数据大小(在si/so字段下)。
分页机制
为了减少虚拟地址映射表项所占用的内存空间,所有的OS都采用了页式管理,也就是分页机制。
多级页表
进程权限级别问题
多数架构的CPU提供4个级别,0代表最高级别,3代表最低级别。多数操作系统在设计的时候,只是用了两个级别,内核运行在级别0上,应用程序运行在级别3上,通常称为ring0和ring3。
网络资料
整理“x86体系架构“方面优秀的网络资料。
- 由Linux内核之旅网站提供的《i386体系架构》。该资料在网络上有pdf版本,也有多个博客,网站有过转载。
- 由李彦昌编写的《80x86保护模式系列教程》。目前在网络上,我只找到chm版本的。
- 有一个叫做DOS怀旧存档的网站,其中保存了很多关于i386基础知识的文档,对于夯实基础知识很有帮助。