关于“物理地址=段基址x16+段内偏移地址”
2016-02-03 09:47
162 查看
以8086为例。
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页。
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页。
相关文章推荐
- 【POJ2417】baby step giant step
- 【BZOJ 3188】【Coci 2011】Upit Splay模板题
- oracle 换行
- AVD设置屏幕大小
- 分页
- 优秀大数据GitHub项目一览
- SQL server中如何使用return,break和continue
- 实现带清除功能的文本输入框(EditText)
- 网络系统调用延迟
- POJ 3026 bfs+最小生成树的应用
- openstack neutron gre网络拓扑实验总结
- (14)shell 函数以及函数参数
- 安卓手机屏幕录像之scr
- Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素
- ExtJS 上传下载控件
- 十六进制 补码 源码
- InputStream与String/byte[]相互转换
- STS中取消show in Breadcrumb方法
- 4320: ShangHai2006 Homework 并查集+离线处理 思路题
- ES6学习——元数据(meta)编程:反射(Reflect)API介绍