段寄存器
用汇编读写某个地址时:
mov dword ptr ds:[0x123456],eax
实际读写地址是 ds.base +0x123456
ES CS SS DS FS GS 共八个段寄存器
系统表指针寄存器:
GDTR, LDTR, IDTR, task register
控制寄存器:
CR0, CR2, CR3, and CR4
16-bit Processors and Segmentation(1978)
8086/8088将分段引入IA-32体系结构。
对于内存分段,一个16位段寄存器可以寻址一个64kb的内存段。8086/8088处理器同时使用四个段寄存器,无需在段之间切换,即可寻址多达256 KB的数据。
一个段寄存器和一个16位 指针(或者通用寄存器)可以寻址20位的地址 (1M内存)。
286 Processor (1982)
intel286处理器在IA-32架构的基础上,使用段寄存器加入了保护模式
保护模式使用段寄存器作为 选择子(指针)指向描述表
描述符是24bit的,可以寻址16MBytes 内存大小,在内存页交换的基础上 提供了虚拟内存管理,以及一些保护机制。
这些机制包括:
- 段
段选择子
段选择子是一个16位的标识符,指向该段的段描述符
段选择子包含:
- index
- TI
- RPL
例如 段选择子为 0x23 ->00100 0 11
- index 为 00100 第 0x4个
- TI 为 0 在GDT 表中
- RPL 为 4 RPL 为用户态权限
找到段描述符
从第0 个开始数第四个:00cff300`0000ffff
段描述符
我们的段描述符为:00cff300`0000ffff->
- base: 00000000
- limit:FFFF F
- limit 为FFFFF 2的20次方为1M 一个段限制长度1M,很明显一个段不止1M,所以limit不是按照字节来算的
- 这与G位有关,limit为内存页数
- type: 3
- S:1 系统段为0,普通段为1
- DPL:11->3
- P:1 有效位
C->1100
- AVL :0
- D/B :1
- 代码段cs 默认寻址类型影响 push 影响,0 ,push压栈2
- 0为16位
- 1为32位
- 数据段
- D/B为0 段选择子描述到的范围不可访问
- D/B位为1 描述的范围可以访问
- G: 1
- G 为1时 页为4K 4096字节 4G
- G为0 时按照字节算,limit 最大1M
type段 可读可写,已经被访问过以及向上或向下拓展
保护模式
- 段+页模式
- 纯段模式
纯段模式
一致代码段
和非一致