Linux内存管理1---内存寻址
1.前言
本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理。
本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础、虚拟地址空间的管理、物理地址空间的管理.
本文将主要以X86架构为例来介绍Linux内存管理的内存寻址。
2. 内存寻址的演变
- 内存寻址是操作系统设计的硬件基础之一
操作系统是横跨软件和硬件的桥梁,
操作系统设计者必须在硬件相关代码和硬件无关代码之间划分清晰的界限,以便操作系统很容易的移植到不同的平台
- 内存寻址各时期对比
|
时代 |
处理器 |
数据 总线 宽度 |
是否 有段 |
地址 总线 宽度 |
访存 空间 |
备注 |
|
石器 时代 |
8080 | 8位 | 无 | 16位 | 64K |
(1)由一个主累加器(寄存器A)和6个次累加器(寄存器B,C,D,E,H和L)组成 (2)次累加器可以配对用来访问16位的内存地址。 (3)访问内存需要通过绝对地址,程序中地址必须通过硬编码,难以重定位 |
|
青铜 时代 |
8086 | 16位 | 有 | 20位 | 1M |
(1)引入“段”,增加了4个段寄存器:CS、DS、SS和ES,分别用于可执行代码段、数据段、堆栈段及其他段, (2)每个段寄存器都是16位的,对应于地址总线中的高16位,段大小为64k (3)通过 16位访内地址(段偏移量)加上段寄存器<<4(段基址) 得到 20位的地址,完成16位到20位的地址映射 |
|
白银 时代 |
80286 | 16位 | 有 | 24位 | 16M |
(1)引入保护模式 (2)80286内存寻址可以有两种方式,一种是先进的保护模式,另一种是老式的8086方式,被称为实模式。 (3)系统启动时处理器处于实模式,只能访问1M空间,经过处理可进入保护模式,访问空间扩大到16M。 (4)每个段的大小还是64k |
|
黄金 时代 |
80386 | 32位 | 有 | 32 位 | 4G |
(1)在段寄存器的基础上构筑保护模式,并保留段寄存器16位; (2)从8086的16位到80386的32位处理器实质上是处理器体系结构的变化(IA32) (3)从寻址方式上说,就是从“实模式”到“保护模式”的变化 (4 )段的大小不再局限于64k而是4GB |
- IA32寄存器简介
| 寄存器 | 寄存器名 | 位数 | 说明 |
|
8个通用寄存器 |
EAX EBX ECX EDX EBP ESI EDI | 32位 | |
|
4个段寄存器 |
CS DS SS ES | 16位 |
(1)8080时CS DS SS ES分别用于存放可执行代码的代码段、数据段、堆栈段和其它段的基地址; (2)80386后用于存放某个段的选择符(段描述符表的索引),段基址(32位)存放在段描述符表(简称段表,每项为8个字节)中,段描述符表的索引就是选择符 |
| 指令指针寄存器 |
EIP |
32位 |
(1)EIP存放下一条将要执行指令的偏移量,这个偏移量是相对于当前正在执行的代码段寄存器CS而言的 (2)偏移量加上当前代码段的基地址,就形成了下一条指令的地址 (3)EIP中的低16位可以被单独访问,起名为指令指针IP寄存器,用于16位寻址 |
| 标志寄存器 | EFLAGS | 32位 | 存放有关处理器的控制标志。很多标志与16位ELAGS含义相同 |
| 4个控制寄存器 |
32位 |
用于分页机制。 (1)CR1是未定义的控制寄存器,供将来的处理器使用。 (2)CR2是缺页线性地址寄存器,保存最后一次出现缺页的全32位线性地址(将在内存管理一章介绍) (3)CR3是页表基址寄存器,保存页表的物理地址,页表总是放在以4K字节为单位的存储器边界上,因此,其地址的低12位总为0,不起作用 注:实模式PE和PG为0,保护模式PE和PG为1 页目录主要用于二级寻址,用于存放页表的基址,可寻址到页表,页表用于寻址到页 |
|
| 4个系统地址寄存器 | |||
| 8个调试寄存器 | |||
| 1个测试寄存器 |
- 物理地址、虚拟地址和线性地址
(1)物理地址:物理主板上内存条所提供的内存空间定义为物理地址空间,其中每个内存单元的地址称为物理地址
注:实际物理地址空间还包含了IO内存。
(2)虚拟地址:应用程序员看到的地址空间称为虚拟地址空间,其中的地址称为虚拟地址
(3)线性地址:一段连续的、不分段的,范围从0到4GB的地址空间,一个线性地址就是一段线性地址空间的一个绝对地址
- 地址之间的转换---保护模式下的寻址

- 地址之间的转换---MMU机制

段机制把虚拟空间的一个地址转化线性地址空间的一个线性地址。选择符是段描述符表的索引,通过它找到段描述符表中的的某项,它存储段的基址。再加上偏移量就可以得到线性地址
分页机制将线性地址转换为物理地址,通过线性地址查找到相应的页目录或页表,再通过线性地址中的偏移量就可以得到物理地址
注:intel手册规定段机制是必选的,它规定分段机制是必须得,分页机制是可选的
- 地址之间的转换---虚拟-线性地址的转换

如上可以看到虚拟地址空间的段基址+段长度与线性地址空间的转换关系
3.问题
1. x86三种模式?
保护模式、实模式、虚拟模式。
实模式段寄存器保存段的基地址;保护模式段寄存器保存的是段描述符表的索引,可以定位到对应的段描述符得到段的基址
2.x86保护模式的作用?
保护模式主要是保护内核空间的权限;
多用户系统下保护各个进程的进程空间
3.为何8位机代码不可重入?
4.32位机的数据总线和地址总线的关系?
4.参考文献
[1] Linux内存管理讲座PPT-陈莉君
Linux内存管理1---内存寻址的更多相关文章
- Linux进程管理——查看内存的工具
Linux进程管理——查看内存的工具 一查看内存的工具vmstat vmstat命令:虚拟内存信息vmstat [options] [delay [count]]vmstat 2 5 [root@ce ...
- SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践
培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...
- [内存管理]linux内存管理 之 内存节点和内存分区
Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...
- Linux内存管理 (25)内存sysfs节点解读
1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...
- Linux内存管理 (16)内存规整
专题:Linux内存管理专题 关键词:内存规整.页面迁移.pageblock.MIGRATE_TYPES. 内存碎片的产生:伙伴系统以页为单位进行管理,经过大量申请释放,造成大量离散且不连续的页面.这 ...
- Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)
专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob.Redzone.Padding. Linux常见的内存访问错误有: 越界访问(out of bound ...
- Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)【转】
转自:https://www.cnblogs.com/arnoldlu/p/8568090.html 专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob. ...
- linux 进程管理和内存分配
1.进程相关概念 进程:正在运行中的程序 内核功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等 Process:运行中的程序的一个副本,是被载入内存的一个指令集合 进程 ID(Pro ...
- window内存管理与内存原理
转自: http://blog.csdn.net/iamfranter/article/details/6826270 WIndows为每个进程分配了4GB的虚拟地址空间,让每个进程都认为自己拥有4G ...
随机推荐
- iOS 【终极方案】精准获取webView内容高度,自适应高度
前言:是这样的,刚写完上一篇文章还没缓过神来,上一篇文章我还提到了,想和大家聊聊原生+H5如何无缝连接的故事.结果我朋友就给我发了两篇他的作品.他的做法也都有独到之处.好的文章都是这样,让你每次看都能 ...
- 上传大数据到SharePoint 2010
今天终于把近5G的数据上传到了SharePoint2010站点上,上传过程中发现几个要注意的问题: 1. 用360浏览器打开SP 2010站点,发现在workspace同步和windows explo ...
- 【SDOI 2017】龙与地下城(组合)
概率论太难了,不会.但这不能阻止我们过题.相信大家都会一个基于背包的暴力做法,我们可以将其看成是卷积的形式就可以用fft优化了.形式化讲,就是求幂级数$ (\sum\limits_{i = 0}^{x ...
- [系统]安装fedora 19
再也没有什么大道至简了. ==== 步骤如下: 1. 备份. 2. 刻镜像. 选fedora-kde,gnome呵呵. 3. 分区,格式化,安装. 上面3步没什么好说的,按照官网installatio ...
- Luogu 1314 【NOIP2011】聪明的质检员 (二分)
Luogu 1314 [NOIP2011]聪明的质检员 (二分) Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有 ...
- <? extends T>和<? super T>的理解
背景:对泛型中使用super和extends关键字进行分析总结. 问题: public class TestExtend { public static void main(String[] args ...
- 在tomcat集群环境下redis实现分布式锁
上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...
- Spark记录-spark-env.sh配置
环境变量 含义 SPARK_MASTER_IP master实例绑定的IP地址,例如,绑定到一个公网IP SPARK_MASTER_PORT mater实例绑定的端口(默认7077) SPARK_MA ...
- 01-单一职责原则(SPR)
1. 背景 类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 2. 定义 不要存在多于一个导致类 ...
- VMware WorkStation9.0 安装centos-6.4
1,设置虚拟机内存为8G时,启动报内存不足错误: Not enough physical memory is available to power on this virtual machine 解决 ...
