《深入理解linux内核》第二章 内存寻址
三种不同的内存地址
- 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址
由16位的段选择符(segment selector)和32位的偏移量组成。 - 线性地址(linear address)(虚拟地址(virtual address))是一个32位无符号整数,可以表示4G的地址,值范围从0x00000000-0xffffffff。
线性地址则对应了硬件页式内存的转换前地址。 - 物理地址(physical address)
用32位或者36位无符号整数表示。用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 - 三者之间的关系逻辑地址------>分段单元------>线性地址------>分页单元------>物理地址
- 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址
硬件中的分段
- 段选择符和段寄存器
如图所示,16位段选择符的最后13位是索引号,第0和1位是2bit位的请求者特权等级(一共有4中特权等级,linux只使用内核态还是用户态),第2位为表指示器。
段寄存器有css,ss,ds,es,fs,gs。其中前三个有特殊用途,后三个是通用段寄存器。 - 段描述符(segment descriptor)
段描述符表放在全卷描述符表(global descriptor table)GDT或者局部描述符表(local descriptor table) LDT 中。
具体的段描述符表类型可以看这里:http://www.sandpile.org/x86/desc.htm - 逻辑地址转线性地址过程
过程分三步:
- 检查段寄存器中的TI和RPL标志,确定段描述符在GDT还是LDT中;
- 把段寄存器INDEX的值*8+GDT/LDT中保存的地址,即可得到段描述符地址。(该地址在64位处理器是64位,在32位处理器是32位)。
如果我们用GDB调试程序时,观察几个段寄存器的值,可以和本书及linux源码中的预设值得到印证。段寄存器的INDEX的值正好是在段描述符表中所在的位置。且64位和32位的区别很大。 - 把逻辑地址的便宜量和段描述符的BASE字段相加即可得到线性地址。
- 段选择符和段寄存器
LINUX中的分页
- 32位系统未开启地址扩展
CR3===>PGD(10)==>PT(10)==>OFFSET(12) 此时页目录项和页表项是32位的,每个页表正好在一个页上,刚好是2^10*4Byte=4096kb 刚好是一页。 - 32位开启物理地址扩展
CR3==>PGD(2)==>PMD(9)==>PT(9)==>OFFSET(12) 此时页目录项和页表项都是64位,但他们是9位的,所以每个页表占用的刚好是2^9*8Byte 刚好也是一页 - 64位系统
CR3==>PGD(9)==>PUD(9)==>PMD(9)==>PT(9)==>OFFSET(12)我的博客:www.while0.com
- 32位系统未开启地址扩展
《深入理解linux内核》第二章 内存寻址的更多相关文章
- 【读书笔记::深入理解linux内核】内存寻址【转】
转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...
- 【读书笔记::深入理解linux内核】内存寻址
我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...
- linux内核分析之内存管理
1.struct page /* Each physical page in the system has a struct page associated with * it to keep tra ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- 《深入理解Linux内核》 读书笔记
深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...
- Linux内核高端内存 转
Linux内核地址映射模型x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通 ...
- Linux内核高端内存
Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通常32位L ...
- (linux shell)第二章--命令之乐(一)
文章来自于我的个人博客:(linux shell)第二章--命令之乐(一) 上一章我们描写叙述了一些linux shell中须要注意的一些语法.接下来我们開始了解linux shell的经常使用 ...
- 【深入理解Linux内核架构】第3章:内存管理
3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...
随机推荐
- Java线程练习
/*线程练习创建两个线程,与主线程交替运行 */ class Text extends Thread{ private String name; Text(String name) ...
- hanoi双塔
汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编 ...
- 为UITextView添加与UITextField一样的边框——UITextField默认边框颜色、宽度、圆角
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3789052.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- RX编程笔记——JavaScript 获取地理位置
RX编程笔记——JavaScript 获取地理位置 2016-07-05
- Python3 多进程和多线程
Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...
- Javascript 中 null、NaN和undefined的区别
1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码 var a1; var a2 = tr ...
- 【转】c#文件操作大全(一)
1.创建文件夹//using System.IO;Directory.CreateDirectory(%%1); 2.创建文件//using System.IO;File.Create(%%1); 3 ...
- java 子类的实例化和代码块初始化过程
1,子类的实例化 1,子父类中的构造函数的特点. 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 为什么呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 子类 ...
- ACE 6.2.0 AIX 编译
注:ace只能使用gnu的make 一.IBM AIX版本 $unameAIX$oslevel6.1.0.0$ ACE+TAO+CIAO-6.2.0.tar 二.GNU make版本:make-3. ...
- jquery div拖动效果示例代码
div拖动效果想必大家都有见到过吧,实现的方法也是有很多的,下面为大家将介绍使用jquery是如何实现的,感兴趣的朋友不要错过 复制代码代码如下: <%@ page language=" ...