《深入理解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机制: 进程的地址空间. ...
随机推荐
- ios Swift 动手写
Swift语言概览 基本概念 注:这一节的代码源自The Swift Programming Language中的A Swift Tour. Hello, world 类似于脚本语言,下面的代码即是一 ...
- Oracle——事务(Transaction)
事务: 事务是指作为单个逻辑工作单元执行的一组相关操作. 这些操作要求全部完成或者全部不完成. 使用事务的原因:保证数据的安全有效. 事务的四个特点:(ACID) 1.原子性(Atomic):事务中所 ...
- 区分.net、c#、asp.net三者间的关系
1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type system). ②包含.net公共语言运行库( ...
- redis 实践—— sorted set, hash set
在这里就不谈redis的安装与启动啦,网上太多人写这个了. 从最近的一个项目[钻石夺宝]说起,如果大家有玩过一元夺宝或者全名夺宝的话,大概会知道如果参与人数多的话,每隔几秒.快的话每隔一秒都会新生成一 ...
- 11_Servlet的一些细节知识点
[Servlet的细节知识点1-----一个Servlet映射到多个URL] 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servl ...
- C语言中的%0nd,%nd,%-nd
C语言中的%0nd printf --> formatted print/格式化输出 一.十进制 d -> decimal/十(shí)进制 int a=1; int b=1234; do ...
- VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
一.准备工作 1.1.创建 zhuzz/tools目录 [root@localhost ~]# mkdir -p /home/zhuzz/tools [root@localhost ~]# cd /h ...
- php 命名空间(要求php5.3以上)
要求php5.3以上 <?phpnamespace test;// 命名空间与目录类似功能,也可定义子命名空间,用分层的方式定义:/*namespace mydir\ok\project; 在声 ...
- c#的多线程
多线程的使用方法: Thread t = new Thread(new ThreadStart (StartMethod)); t.Start(); private void StartMethod( ...
- Markdown语法备忘
标题 标题 标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加 # 号即可. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六 ...