《深入理解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机制: 进程的地址空间. ...
随机推荐
- 获取文件sha1 值
单元 IdHashSHA申明 function GetFile_SHA1(const iFileName: String): String; //Checksum hash value for fir ...
- 自定义函数实现NULL值替换
数据库环境:SQL SERVER 2005 有时候,想将查询查询数来的数据格式化一下,不希望显示NULL值,或者复制表的数据时,被插入的表不允许有NULL. 我们可以通过ISNULL()函数或者COA ...
- IOS-UI-UIDynamic(二)
UIPushBehavior :推动效果 UIAttachmentBehavior:附着效果 UISnapBehavior:迅速移动效果 一.重要的属性 UIPushBehavior :推动效果 ty ...
- C# 多任务之 Task
Task 是什么 ? Task 是一个类, 它表示一个操作不返回一个值,通常以异步方式执行. Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中. 继承层 ...
- 关于“undefined reference to”错误
哪些问题可能产生undefined reference to错误? 1.没用生成目标文件 比如说hello.o文件,由于名字写错.路径不对.Makefile缺少. 2.没用添加相应的库文件.so/dl ...
- POJ 2777(线段树)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
- 网站开发常用jQuery插件总结(一)提示插件alertify
1.alertify插件功能 主要实现提示功能,用于代替js中的alert,confirm,prompt,显示友好的提示框 2.alertify官方地址 http://fabien-d.github. ...
- sprintf函数php的详细使用方法
PHP sprintf() 函数 先说下为什么要写这个函数的前言,这个是我在微信二次开发的一个token验证文档也就是示例文档看到的一个函数,当时非常不理解,于是查了百度,但是很多结果都很笼统,结果也 ...
- ssh自动登录的4种实现方法
ssh自动登录的几种实现方法,记录在此. 1. 自动ssh/scp方法 A为本地主机(即用于控制其他主机的机器) ; B为远程主机(即被控制的机器Server), 假如ip为192.168.60.1 ...
- Websocket协议数据帧传输和关闭连接
之前总结了关于Websocket协议的握手连接方式等其他细节,现在对socket连接建立后的数据帧传输和关闭细节总结. 一.数据帧格式 数据传输使用的是一系列数据帧,出于安全考虑和避免网络截获,客户端 ...