2.1 x86体系结构初步
2.1.1 80x86计算机系统初步
字单元地址用它的低地址来表示。
字节和字节访问是存储器访问的最小模式,访问的基本单元。
对于x86,因为它采取小端存储模式,字单元地址用它的低位地址来表示。
2.2.1 80x86处理器与保护模式初步
你跑100个程序每个程序是2G的话 那不可能有200G内存空间 这个没有 那你是怎么实现的呢 相互之间又怎么防止我的数据 不会干扰到你的数据的读写 这里面就是需要有个保护机制 所以把它称为保护模式 程序的存储区呢 采用分页分段的存储管理机制 达到分级使用互不干扰的这个目的 也就是说 使每个任务每个程序看起来 我好像独占了一块连续的空间 这个连续空间 当然 实际上是一个 virtual的 是个逻辑上的 物理上怎么实现 就通过这种保护模式来实现
8个通用寄存器 eax到edi 到esp到edp
那么esp呢当然有点特殊 它是用作于硬件支持的栈顶的 指向栈顶的寄存器 叫栈顶指针寄存器 这我回头会讲
edp呢也有点特殊 它呢实际上是用作 程序运行时候 这个过程调用的时候 这个当前这个过程 它在这个程序栈里面 它的所在的栈针 这个我们回头会讲到 它的所在的栈针的基址寄存器 我们回头会讲这些事儿
同时呢还有6个段寄存器 这个实际上是历史上遗留下来的 段寄存器的长度是16位 其中13位代表内存段的一个编号 称之为“段选择器” 这个稍微展开讲讲看 蛮重要的 就说 我把程序运行的时候啊 就占据了一块连续的空间 这连续的空间实际上在运行的时候是分段的 每一段一段都有一个区分的
那段怎么来区分呢 通过段寄存器来区分 那么段寄存器怎么区分法呢 实际上是这样 就看这张图啊 大致给出个原理 就保护模式下的80X86模式 就是段模式 实际上分成为段模式 页模式
页模式呢我们重点会在以后讲mips的时候 用页模式来简介虚存是怎么实现的
咱们今天就简单介绍一下段模式 首先就是说它支持多任务的处理功能 支持虚拟存储器的特性 那什么意思呢 我们写程序的时候 你会 程序里面会有地址 就是指针 或者说你的地址 内存地址 这个地址呢称之为逻辑地址 逻辑地址呢实际上由两个要件构成 一个SELECTOR 叫做段选择器
第二就是OFFSET 就是段选择器确定了 你要所访问的这个memory在哪个段 段是个连续空间 段内呢由OFFSET来表示 我需要把这个逻辑地址啊 转换一个成物理地址
那么为什么做这个转换呢 就刚才提到了 你可以起到这个保护的作用 就相当于每个程序 运行时候 它所看到逻辑地址空间都是一样的 但是呢我通过硬件 通过处理器 把你这个逻辑地址转换成分离的物理地址 这样就会造成那个保护的效果啦 就是 每个程序 我写程序的时候 可以不用顾及到别人程序是不是在跑 他的内存怎么使用 因为我们都是 看起来都是访问一个连续地址空间 但实际上运行的时候 虚存映射到实际的物理地址空间 把它映射都分开了 起到保护 不会相互干扰的这个作用
那怎么区分开呢 首先 它要做一个虚实地址的转换 相当于就是说 在保护模式下有个存储器的寻址嘛 在这种方式下呢 你的虚存地址两个要素 一个SELECTOR一个OFFSET OFFSET在这个变换当中它是不变的 SELECTOR起到关键性的作用 SELECTOR叫做段寄存器 严格来说它应该叫做段选择址 相当于它告诉你 有了这个SELECTOR 你怎么从一个表里头 就专门有个段描述符的一个表 我在这个段描述符的这个表里面 根据你的段选择器 或者段选择址 把你的这个程序所对应的这一段的物理的 起始地址 就Base Address给它提取出来 这Base Address加上你的OFFSET 两个一加来生成最后的那个物理地址 物理地址相当于就是说你通过物理总线 访问这个memory时候的那个地址
保护模式保护什么?
就是分清不同任务使用的存储区,不允许随便使用其他任务的数据和代码。
那相当于 先是取GDT 通过GDT来定位LDT 再通过这个LDT来定位你的段基址 有了这个段基址再加上这个OFFSET 你最终的物理地址才能这么计算出来
参考文献:
1. 汇编语言程序设计 - 清华大学 - 学堂在线。