Linux内存地址映射
引言
看过原博主的一些文章,写得很好,虽然博主不提倡这种拿来主义,但我还是忍不住一时手痒.呵呵本文是针对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内存地址映射的更多相关文章
- Linux内存寻址之分段机制及分页机制【转】
前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...
- Linux内存初始化(四) 创建系统内存地址映射
一.前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init.当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系 ...
- linux内存管理
一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分: 1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...
- Linux内存管理原理
本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
- Linux内存管理原理【转】
转自:http://www.cnblogs.com/zhaoyl/p/3695517.html 本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址 ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- 探索 Linux 内存模型--转
引用:http://www.ibm.com/developerworks/cn/linux/l-memmod/index.html 理解 Linux 使用的内存模型是从更大程度上掌握 Linux 设计 ...
- Linux内核分析(三)----初识linux内存管理子系统
原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...
- Linux内存描述之高端内存--Linux内存管理(五)
1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...
随机推荐
- 处理ListView数据为空的情况
如何处理需要填充的数据为空的情况? ListView及其他继承自AdapterView的类都有一个简便的处理这种情况的方法:setEmptyView(View). 当ListView的Adapter为 ...
- Toncat-OpenSSL双向认证配置(iOS)
OpenSSL生成证书 要生成证书的目录下建立几个文件和文件夹,有./demoCA/ ./demoCA/newcerts/ ./demoCA/private/ ./demoCA/index.txt ( ...
- 记录JAVAWEB部署到JBOSS中遇到的问题
服务器环境 jdk1.8.0_212 + jboss-eap-6.4 系统是 Service 2008 R2 数据服务器 oracle12c 系统是 Service 2008 R2 首先安装的or ...
- Office 365 开发 集成VS2013 (一)
博客地址 http://blog.csdn.net/foxdave 题外话:好久不写了,个人比较懒,有时候想写东西的时候想一想就又不知从何下笔了.之前因为某些机缘发现自己完全是个管理外行,所以最近下了 ...
- chrome 49 版本bug: flex父元素设置flex:1 , 子元素用height:100%无法充满父元素
1 <div class="container"> <div class="item"> <div class="ite ...
- Python流程控制-逻辑运算-if...else语句
摘录自:http://www.runoob.com/python/python-if-statement.html Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执 ...
- Linux udhcp client (udhcpc) get IP at anytime
/*************************************************************************************** * Linux udh ...
- Scss开发临时学习过程||webpack、npm、gulp配置
SCSS语法: 假设变量申明带有!default,那么如果在此申明之前没有这个变量的申明,则用这个值,反之如果之前有申明,则用申明的值. ‘...’传递多个参数: @mixin box-shadow( ...
- Python ---- list和dict遍历
refer to: http://www.cnblogs.com/icejoywoo/p/3531869.html 对于python3, 可能有不一样之处, refer to: http://do ...
- cocos2dx 3.0 +VS2013 环境搭建
1.需要javasdk,android sdk,ndk,python 2.各种环境变量配置如下: JAVA_HOME:C:\Program Files\Java\jdk1.7.0_67 Path:%J ...