从 8086 到 x86 的实模式和保护模式
![image.png](https://img-blog.csdnimg.cn/img_convert/68aebfbaf8829a92c930aa009d2ba682.png#align=left&display=inline&height=444&margin=[object Object]&name=image.png&originHeight=592&originWidth=926&size=131502&status=done&style=shadow&width=695) 8086 数据总线:16 位,地址总线 20 位
8 个 16 位的通用寄存器:AX、BX、CX、DX、SP、BP、SI、DI 其中 AX 可以分成两个 8 位的来用,分别是 AH 和 AL(High 高位、Low 地位)
IP 寄存器,指令指针寄存器(Instruction Pointor Register),指向代码段中下一条指令的位置 CPU 会根据 IP 不断地将指令从内存的代码段中加载到 CPU 的指令队列中,然后交给运算单元执行
每个进程都分代码段和数据段,相关的寄存器是 CS、DS、SS、ES CS 是代码段寄存器(Code Segment Register),存放代码在内存中的位置 DS 是数据段寄存器(Data Segment Register),存放数据在内存中的位置 SS 是栈寄存器(StackRegister),这里所说的栈是具有 FILO 的特性的
CPU 运算中需要加载内存中的数据,通过 DS 找到内存中的数据,加载到寄存器中 对于一个段,有一个起始地址,段内位置称为偏移量(Offset) 在 CS 和 DS 中存放段的起始地址 代码段的偏移量在 IP 寄存器中,数据段的偏移量在通用寄存器中
**Q:**8086 的寄存器都是 16 位的,但是地址总线是 20 位,怎么凑够这 20 位呢? **A:**起始地址 * 16 + 偏移量 也就是把 CS 和 DS 中的段起始地址左移 4 位,变成 20 位 然后加上 16 位的偏移量,这样得到 20 位的数据地址 这样就可以寻址 2^20=1M **Q:**如果想要访问超过 20 位的地址,比如 1M+X **A:**总线上最多发 20 位,所以超过 20 位的部分发不出去 Q:一段有多大? A:偏移量只能是 16 位的,所以一个段最大是 2^16=64k。
![image.png](https://img-blog.csdnimg.cn/img_convert/efcef3d473a36f2f5e2978f6bf5fd146.png#align=left&display=inline&height=164&margin=[object Object]&name=image.png&originHeight=164&originWidth=398&size=23615&status=done&style=stroke&width=398)
到了 32 位处理器,为了保持兼容: 通用寄存器 && IP寄存器都扩展成 32 位的 ![image.png](https://img-blog.csdnimg.cn/img_convert/d4188613cf3c3b2059307cf766e968db.png#align=left&display=inline&height=155&margin=[object Object]&name=image.png&originHeight=207&originWidth=560&size=41614&status=done&style=stroke&width=420) ![image.png](https://img-blog.csdnimg.cn/img_convert/95e4e1ff76e1de893985448ec66707b5.png#align=left&display=inline&height=53&margin=[object Object]&name=image.png&originHeight=53&originWidth=520&size=5688&status=done&style=stroke&width=520) 段寄存器(CS、DS、SS、ES)变化较大,他们还是 16 位的,但是里面存的内容改变了 8086 存的是段起始地址 32 位系统下不再是段的起始地址,段的起始地址存在内存的某个地方 这个地方是一个表格,表格中的一项是段描述符(Segment Descriptor) 段描述符中才是真正的段起始地址,段寄存器保存表格中的哪一项,称为选择子 ![image.png](https://img-blog.csdnimg.cn/img_convert/1a709ae9f3d4269f19b34f2a0575b776.png#align=left&display=inline&height=161&margin=[object Object]&name=image.png&originHeight=161&originWidth=937&size=47239&status=done&style=none&width=937) 这种情况下,为了快速拿到段的起始地址,段寄存器会从内存中拿到段描述符到 CPU 的高速缓冲器
前一种模式称为实模式(Real Pattern),后一种模式称为保护模式(Protected Pattern)
x86 架构有两种模式:实模式、保护模式
- 实模式只能寻址 1M,每个段最多 64K
- 保护模式能够寻址 4G
系统刚启动的时候,CPU 处于实模式,这时和原来的模式是兼容的,当需要更多内存时,遵循一定的规则,执行一系列操作,然后切换到保护模式,这样就可以用到 CPU 更强大的能力。
![image.png](https://img-blog.csdnimg.cn/img_convert/31c5803b5ee444bf5a97b7b8213ef5d1.png#align=left&display=inline&height=382&margin=[object Object]&name=image.png&originHeight=382&originWidth=915&size=92602&status=done&style=none&width=915)
开机启动!
ROM(Read Only Memory,只读存储器),上面固化了一些初始化程序,也就是 BIOS(Basic Input and Output System,基本输入输出系统)。
1、按下启动按钮,主板上电。 2、
|