段寄存器

用汇编读写某个地址时:

  1. 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

image.png

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 内存大小,在内存页交换的基础上 提供了虚拟内存管理,以及一些保护机制。
这些机制包括:

段选择子

image.png
段选择子是一个16位的标识符,指向该段的段描述符
段选择子包含:

  • index
  • TI
  • RPL

例如 段选择子为 0x23 ->00100 0 11

  • index 为 00100 第 0x4个
  • TI 为 0 在GDT 表中
  • RPL 为 4 RPL 为用户态权限

找到段描述符
image.png
从第0 个开始数第四个:00cff300`0000ffff

段描述符

image.png
我们的段描述符为: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段 可读可写,已经被访问过以及向上或向下拓展
image.png

保护模式

  • 段+页模式
  • 纯段模式

纯段模式
一致代码段
和非一致