IA-32架构 (Intel Architecture 32-bit)概览 和 8086小总结
IA-32架构 (Intel Architecture 32-bit)概览 和 8086小总结
寄存器
8086
- 8个通用寄存器
AX BX CX DX SI DI BP SP
32bit处理器在此通用寄存器扩展到32bit
EAX EBX ECX EDX ESI EDI EBP ESP
实模式下也可以使用,但是
32bit
寄存器的高16
位不可独立使用32bit处理器拥有自己的工作模式:保护模式(使用32跟地址线,寻址范围4GB)
32bit
EIP
扩展到32位那么可以访问到所以的内存地址,不在需要像8086一样分段访问,但是IA-32也是基于分段模型,依旧以段为段位访问内存
平坦模式(Flat Mode
)
因为EIP
可以访问到所有内存地址,可不分段,段基址=0x00000000
,长度=4GB
段
8086下程序可以访问和修改不属于自己的内存地址,32bit下,加载程序要求:
定义程序拥有的段,特权级别,类型的属性,程序访问一个段时,处理器检查防止对内存的违规访问
8086的段寄存器CS,SS,DS,ES
在32Bit下变成—>段选择器(选择要访问的段),段寄存器还包括一个不可见部分(即描述符高速缓存器),给cpu提供了段的基地址+各种访问属性
32bit下新增2个段寄存器FS
和GS
基本工作模式
- 1982年处理器
80286
,16bit,但是又24根地址线(寻址16MB),首次提出保护模式概念
段寄存器不在是段地址(实际段地址位于描述符高速缓存器中,24bit) ,所以段可以位于内存中的任何地址,而8086中因为段地址转成实际内存地址要左移4位置(乘以16进制的10),所以段地址和16字节对齐
偏移地址仍是16位,所以一个段最长不能超过64KB
- 因为段长度的限制16位的保护模式很少人知道
- 1985年80386处理器,32跟地址线
刚刚加电,处理器处于实模式,->经过设置才到保护模式
除了保护模式,32bit处理器还提供 虚拟8086模式(V86):
IA-32处理器模拟成多个8086处理器并行工作,
V86
模式属于保护模式的一种,意义:当时兼容8086程序多有用,现在意义不大
现代处理器结构特点
多级流水线细分子任务
已知寄存器由SRAM(静态),内存DRAM(通电刷新),在内存和处理器之间添加SRAM的高速缓存(程序的局部性原理)
在高速缓存未命中的情况下,处理器在取得数据前必须重新装载高速缓存,这段额外的时间等待从内存载入高速缓存 称为 不中惩罚
每款处理器的缓存可能核心共享的不一样,并且有多级高速缓存
乱序执行
指令拆成微指令同时执行
寄存器重命名
通用寄存器个数有限但是在cpu内部临时寄存器个数较多,多个指令中用到某寄存器且可以乱序执行,则用临时寄存器代替,最后临时寄存器的内容写回,称为引退
分支目标预测
当流水线中遇到一条转移指令,则后面的指令都无效,此时需要清空流水线,转跳到目标地址重新开始流水线的执行,流水线越长,用错误的分支填充流水线导致浪费的时间越多
1996年Pentium Pro引入分支预测(
Branch prediction
):例如
loop
,第一次转跳时,在分支目标缓存器(Branch target buffer
)记录当前指令的地址、分支目标地址、本次分支预测结果,下次执行时查看BTB,如果预测失败,清空流水线和BTB
8086总结
分段内存管理机制:
20根地址线,寻址能力
1MB
,16位寄存器不能满足,才有内存地址 = 段地址*16+偏移地址.16位的偏移地址决定了一个段最大为64K,
外围设备的地址直接映射到内存中,读写IO端口=访问内存
理解书中通过写一个加载器理解内存机制
1 |
|
程序:
1 |
|
加载器放在主引导记录中,开机载入内存0x7c00:0
,加载位于磁盘逻辑扇区100的程序到内存0x10000
处执行
- 无论用masm或者nasm编译,注意程序编译出来的地址从0开始,在nasm中用vstart指定段内数据标号的偏移地址起始地址
参考:
《X86实模式到保护模式》
《汇编语言》
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!