Linux内存寻址
我会尽力以最简洁清晰的思路来写这篇文章。
所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程。因为操作系统要兼顾许多东西,所以也就变得复杂。
逻辑地址 → 线性地址 → 物理地址
逻辑地址 = 段 + 偏移量
因为:最开始cpu中的alu宽度只有16位,但地址总线宽度有20位。所以设置四个段寄存器:cs(指令),ds(数据),ss(堆栈),es(其它)。
每个段寄存器16位,对应地址总线高16位。每条指令中的16位内部地址与某个段寄存器中内容相加,得到20位的实际地址。
上述的16位内部地址到20位实际地址的转换还是8086的时代。
到了80386,32位cpu的时代,许多情况都发生改变。其中一点:要实施“保护模式”。还要兼容过去的段寄存器。
于是,之前的公式从新写为:
逻辑地址 = 段选择符(16位) + 偏移量(32位)
所以对80386cpu的寻址还是要基于从前8086寻址方式来理解,《linux内核源代码情景分析》中这样描述:

可简单记为:段寄存器(段选择符) → 地址段描述结构(段描述符) → 基地址 → 指令中发出的地址 + 基地址 = 物理地址
地址段描述结构(段描述符) 从何而来:在cpu中增设两个寄存器,一个是全局性的段描述表寄存器GDTR;一个是局部性的段描述表寄存器LDTR。
段描述符地址 = 段选择符index字段×8 + gdtr/ldtr寄存器中的值
这张图可以表现,怎样由段寄存器(段选择符)得到段描述符 。

段选择符得到“段”的过程,一种是访问段描述表得到段描述符。
另外还可以通过非编程寄存器,不访问段描述表得到段描述符。
总之,是段选择符(段寄存器) → ( 段描述符表 → )段描述符 → 基地址的过程。

段描述符:

继续推导之前的式子:
段描述符的获得:段选择符index字段×8 + gdtr/ldtr寄存器中的值
基址 = 段描述符Base字段
逻辑地址 = 段选择符(16位) + 偏移量(32位) = 段描述符Base字段 + 偏移量

参考资料:
《汇编语言》王爽
《linux内核源代码情景分析》毛德操
《Understanding the Linux Kernel》Daniel P. Bovet / Marco Cesati
Linux内存寻址的更多相关文章
- Linux内存寻址之分页机制
在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...
- Linux内存寻址之分段机制及分页机制【转】
前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...
- Linux内存寻址之分段机制
前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- Linux内存管理1---内存寻址
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...
- 【读书笔记::深入理解linux内核】内存寻址【转】
转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...
- 【读书笔记::深入理解linux内核】内存寻址
我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...
- Linux内存管理和寻址详解
1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 L ...
- linux内存管理
一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分: 1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...
随机推荐
- sql中列数据横着显示
列数据横着显示:CREATE TABLE StudenScore(stuname VARCHAR(25) , kc VARCHAR(25) , fs INT)INSERT INTO StudenSco ...
- Raid详解
Raid详解 一.什么是RAID 磁盘阵列全名是『Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列. RAID 可以透过一 ...
- Spring 4集成 Quartz2(转)
本文将演示如何通过 Spring 使用 Quartz Scheduler 进行任务调度.Spring 为简化 Quartz 的操作提供了相关支持类.本文示例使用的相关工具如下: Spring 4.2. ...
- 博客的开端,找对象不再new
今天是第一次用blog,小白开始完善了!! 希望大家多多照顾一下.
- jqGrid学习笔记(二)
本节介绍jqGrid其他的使用方法,主要是一些基本操作,特殊的数据显示等. 1 刷新jqGrid数据. 常用到刷新jqGrid数据的情况是,在用到查询的时候,根据查询条件,请求数据,并刷新jqGrid ...
- js浮点数计算问题 + 金额大写转换
一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 ...
- libcurl多线程超时设置不安全(转)
from http://www.cnblogs.com/kex1n/p/4135263.html (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议 ...
- cadence学习之——原理图库的添加及器件的放置
画原理图,库是必不可少的,库有cadence自带的,也可以自己建自己的库,然后在画原理图工程时, 这些库都需要被添加进原理图工程才能使用. 1.库的添加 打开Place Part属性框,操作如下: ( ...
- [转]Excel 取汉字拼音首位
转自:http://jingyan.baidu.com/article/63acb44adca44461fcc17e85.html 转自:http://jingyan.baidu.com/articl ...
- [转] 在Linux平台使用mhVTL虚拟化磁带库
原文来自:LIUBINGLIN ---- http://blog.itpub.net/23135684/viewspace-1307626/ <在Linux平台安装mhVTL虚拟化磁带库> ...