《深入理解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机制: 进程的地址空间. ...
随机推荐
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
------------------------------------------- 继承 一段代码: #import <Foundation/Foundation.h> @interf ...
- c#编写简单计算器
刚接触c#,依照惯例,写个简单的计算器,只写了加法,乘法,其他的类似,编辑器用的vs2008 首先打开vs ,新建c#的Windows窗体应用程序,接下来的项目的名称是WindowsFormsAppl ...
- bat文件的妙用1-一键开启所有开发软件
每天早上来的第一件事情,就是打开电脑,然后开一堆的软件 1.wamp 开发环境 2.钉钉 通讯工具 3.PHPstrom 开发工具 4.nodejs.bat Nodejs的扩展(node D:/w ...
- Raphael:JS矢量图形库
Raphael:JS矢量图形库 2016-08-29 http://dmitrybaranovskiy.github.io/raphael/
- Cassandra1.2文档学习(8)—— 数据管理
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_manage ...
- javascript学习笔记4
1. 分析一下代码执行结果 分析为什么? var a = 12; b = 34; c = 56; ++a; //a结果 13 a++; //a结果 14 c = ++a + b; ...
- dedecms 获取文章发布时间和获取文章最后更新时间
文章发布时间:[field:senddate function=MyDate('m-d',@me)/] 文章最后更新时间:[field:pubdate function=MyDate('m-d',@m ...
- python log 层次结构
文件结构 - run.py - b -- __init__.py run.py import logging import b log = logging.getLogger("" ...
- #Leet Code# Permutation
描述: 输出全排列 代码: class Solution: # @param num, a list of integer # @return a list of lists of integers ...
- Smlusm随笔目录索引
1.MVVM Light Toolkit ) [转]Mvvm Light Toolkit for wpf/silverlight系列之搭建mvvmlight开发框架 2) [转]Mvvm Light ...