Segmentation 提供的机制是隔离格子的code, data, stack;
Paging 提供的是一种虚拟内存系统,当然也提供多任务之间的隔离;
虚拟地址到物理地址的转换如下图:
如上图,进程读写的地址是VA(虚拟地址),通过分段的机制,指向到LA(线性地址)中的某些段,线性地址通过分页最终可以指向到实际的内存的PA(物理地址)。
分段是必选的,分页是可选的,如果不选择分页的话,LA就等于PA了,那么这个地址空间就是CPU的数据总线可以访问的空间了。
Multi-Segement Model如下图:
每个程序都有自己的段描述符表和自己的段。
虚拟地址到线性地址的转换如下图:
段选择器是16bit(使用13位,共有8*1024个段描述符)的,指向段描述符表中的段描述符,段描述符是8字节的,包含基地址和段的长度limit等信息,段地址加上段偏移,就可以拿到lA了。
32位地址,4KB 页大小时候的线性地址转换如下图:
offset是12位,也就是4*2^10=4KB空间;
页目录是10位,页表是10位,页大小是4KB,所以可以寻址的空间是2^10*2^10*4KB=4GB;
32位地址,4MB页大小的时候的线性地址转换如下图:
offset是22位,因此页的大小也就是4*1024*1024Byte=4MB;
也目录是10位,页大小是4MB,所以可以寻址的空间是2^10*4MB=4GB;
CPU读写内存地址的整体拓扑大概应该是如下图:
参考文献:IA编程手册,卷3系统编程指南,第3章:保护模式的内存管理