以8086为例。
1、段基址和段内偏移地址都是16位(8086仅有16位数据总线);物理地址是20位(8086有20位地址总线)。
2、由于段内偏移地址是16位,所以每个段最大2^16,即0xFFFF。
3、段基址也是16位的,它放在一个20位的数据中,则低4位一定为0。
1、段基址和段内偏移地址都是16位(8086仅有16位数据总线);物理地址是20位(8086有20位地址总线)。
2、由于段内偏移地址是16位,所以每个段最大2^16,即0xFFFF。
3、段基址也是16位的,它放在一个20位的数据中,则低4位一定为0。
4、公式中以十进制的眼光看,确实不好理解,然则以十六进制看,再结合下图,就易懂了
00000 |---------|
| |
0FFFF |_____|
10000 | |
| |
1FFFF |---------|
以10000-1FFFF为例,段基址是1000,左移4位即成了10000,加上16位的偏移地址,正好形成10000-1FFFF间的某个物理地址。
注意:实模式下,段寄存器存的是段基址,以上公式直接得到物理地址,但是在保护模式下,段寄存器内存放的是段选择子,
用段选择子到段描述符表中取得段基址,再加上偏移地址,得到的是线性地址(段式内存管理),还不是物理地址,线性地址被划分为4k的页,
页面再映射到物理地址(页式内存管理),注意连续的页面映射在物理地址上可以是不连续的,具体可参考《Linux内核源代码情景分析》第31页和33页。