引言

看过原博主的一些文章,写得很好,虽然博主不提倡这种拿来主义,但我还是忍不住一时手痒.呵呵本文是针对32位x86 CPU中Linux内核地址映射过程的详细介绍和示例.其中由浅入深,介绍了相关寄存器,逻辑地址,线性地址,物理地址之间的联系和区别,还介绍了分页机制分段机制和地址映射.对于我这等缺乏理论的小菜鸟来说实可谓金科玉律,点石成金.

在Intel体系结构的CPU中,现代操作系统如Linux都采用内存保护模式来管理内存.我们看Linux内核中的内存管理相关内容时,会遇到一个基本问题:普通用户程序中的地址是如何转换到内存上的物理地址的?IA-32架构的CPU规定地址映射过程是逻辑地址–>线性地址–>物理地址.Linux既然能在Intel架构的CPU上运行,就要遵守这个规定,那么Linux又是如何进行地址映射的?

本文以RHEL5.8 i686内核源码版本2.6.18-308(源码下载地址ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/),在IA-32架构CPU为基础,分析CPU架构下的地址映射过程及Linux内核中的实现,并给出一些工具(附源码)来验证整个地址映射过程(包括PAE机制下的映射),方便我们更直观和深入理解Linux在x86 CPU地址映射.对于Linux在x64_64 CPU中的内核地址映射过程,会在另外一篇文章中单独介绍.

目 录

1 概述… 3

2 IA-32体系结构内存地址映射… 4

2.1 CPU相关寄存器… 4

2.1.1 系统寄存器… 5

2.1.2 内存管理寄存器… 5

2.2 保护模式的内存管理… 7

2.3 32位时页面机制地址映射… 9

2.3.1 逻辑地址到线性地址的映射… 9

2.3.2 线性地址到物理地址的映射… 11

2.4 PAE页面机制地址映射过程… 12

2.4.1 PDPTE寄存器… 12

2.4.2 逻辑地址到线性地址的映射… 13

2.4.3 线性地址到物理地址的映射… 13

3 Linux内核的地址映射过程… 15

3.1 段式映射过程… 15

3.2 页式映射过程… 17

4 Linux地址映射实验… 19

4.1 gdtr和cr3寄存器值的获取… 20

4.2 读取物理内存上的数据… 21

4.3 地址映射过程实验… 21

4.3.1 段式映射过程… 23

4.3.2 页式映射过程… 24

4.4 PAE机制下地址映射过程实验… 26

4.4.1 段式映射过程… 26

4.4.2 页式映射过程… 27

5 常见问题及解答… 28

32位x86 CPU中Linux内核地址映射过程,并且给出实验验证整个地址映射过程资源如下

完整文档下载地址:http://yunpan.cn/QI7E36mg3EUx9  提取码 373c

实验相关源码下载地址:http://yunpan.cn/QahPnrGxn3eIu  提取码 7b04

64位x86 CPU中Linux内核地址映射过程,并且给出实验验证整个地址映射过程资源如下

完整文档下载地址:http://yunpan.cn/QI7WxSLYAiS72  提取码 66e5

实验相关源码下载地址:http://yunpan.cn/QahP8XRZrIzXJ  提取码 5d07

本文转自:http://ilinuxkernel.com/?p=1276

Linux内存地址映射的更多相关文章

  1. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  2. Linux内存初始化(四) 创建系统内存地址映射

    一.前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init.当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系 ...

  3. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

  4. Linux内存管理原理

    本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...

  5. Linux内存管理原理【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3695517.html 本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址 ...

  6. Windows内存管理和linux内存管理

    windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...

  7. 探索 Linux 内存模型--转

    引用:http://www.ibm.com/developerworks/cn/linux/l-memmod/index.html 理解 Linux 使用的内存模型是从更大程度上掌握 Linux 设计 ...

  8. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  9. Linux内存描述之高端内存--Linux内存管理(五)

    1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...

随机推荐

  1. jquery检测input checked 控件是否被选中的方法

    jquery检测input checked 控件是否被选中 js部分 复制代码代码如下: function tongyianniu(){ var gouxuan=$('input[type=check ...

  2. hosts 配置

    hosts 配置 在windows上比较好的方法就是在本地配制hosts,在windows/system32/drivers/etc/hosts 下,增加 127.0.0.1 m.t.XXXX.com ...

  3. Winform开发常用控件之ComboBox、ListBox

    ComboBox就是我们常见的下拉框,对于此类控件,我们最关心的当然是数据的绑定和选择值得获取. 首先介绍个属性DropDownStyle,如果不允许ComboBox输入值,只能选择,就选DropDo ...

  4. java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)

    近些日子在做一个项目,在项目中需要用到spring的定时任务,但是在操作数据库的时候发现总是不能正确的进行数据的插入,经过查看才发现:是因为service层不能够通过普通的方法注入到action,所以 ...

  5. MemSQL start[c]up Round 1 B题

    题目链接 http://codeforces.com/contest/325/problem/B 第一遍写了暴搜,果断TLE 然后上了二分,结果120组数据只有第40组过不了,我就写了奇怪的东西... ...

  6. ambassador 学习三 限速处理

    与认证类似ambassador 也是委托给三方的其他服务进行限速处理 基本的环境安装可以参考相关文档,主要还是qotm 服务 官方参考实现的简单限速服务 --- apiVersion: v1 kind ...

  7. Javascript-自己定义对象转换成JSon后怎样再转换回自己定义对象

    man是自己定义的对象,使用var tim = JSON.stringify(man); var newman=JSON.parse(tim)后newman的类型是"object" ...

  8. RabbitMQ 概念与Java例子

    RabbitMQ简介 目前RabbitMQ是AMQP 0-9-1(高级消息队列协议)的一个实现,使用Erlang语言编写,利用了Erlang的分布式特性. 概念介绍: Broker:简单来说就是消息队 ...

  9. zipkin:和springcloud集成过程记录

    发现全是springcloudapp的名称,然后是springcloudapp(http://localhost:8080/hello/tom)工程单独调用并没有通知zipkin: 原来是因为rest ...

  10. oracle数据库启动时出现ORA-01157和ORA-01110问题

    sql>startup mount; sql>alter database open; RA-01157: 无法标识/锁定数据文件 10 - 请参阅 DBWR 跟踪文件ORA-01110: ...