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---内存寻址的更多相关文章

  1. Linux进程管理——查看内存的工具

    Linux进程管理——查看内存的工具 一查看内存的工具vmstat vmstat命令:虚拟内存信息vmstat [options] [delay [count]]vmstat 2 5 [root@ce ...

  2. SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践

    培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...

  3. [内存管理]linux内存管理 之 内存节点和内存分区

    Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...

  4. Linux内存管理 (25)内存sysfs节点解读

    1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...

  5. Linux内存管理 (16)内存规整

    专题:Linux内存管理专题 关键词:内存规整.页面迁移.pageblock.MIGRATE_TYPES. 内存碎片的产生:伙伴系统以页为单位进行管理,经过大量申请释放,造成大量离散且不连续的页面.这 ...

  6. Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)

    专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob.Redzone.Padding. Linux常见的内存访问错误有: 越界访问(out of bound ...

  7. Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8568090.html 专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob. ...

  8. linux 进程管理和内存分配

    1.进程相关概念 进程:正在运行中的程序 内核功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等 Process:运行中的程序的一个副本,是被载入内存的一个指令集合 进程 ID(Pro ...

  9. window内存管理与内存原理

    转自: http://blog.csdn.net/iamfranter/article/details/6826270 WIndows为每个进程分配了4GB的虚拟地址空间,让每个进程都认为自己拥有4G ...

随机推荐

  1. 自学Zabbix4.3 zabbix实战监控Web网站性能

    自学Zabbix4.3 zabbix实战监控Web网站性能 用zabbix如何监控web性能和可用性呢?一般分为四个步骤:打开网站.登陆.登陆验证.退出,看实例. 1. 检测流程 1. 打开网站:如果 ...

  2. BZOJ 193题纪念

  3. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  4. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  5. [luogu3398][仓鼠找sugar]

    luogu3398 思路: 假设松鼠a要从a1去a2,松鼠b要从b1去b2,ks表示lca(a1,a2)和lca(b1,b2)中深度较深的那个.那么,若要使得两只松鼠可能相遇,则只要满足lca(a1, ...

  6. JAVA中String.format()的使用

    String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.format()方法有两种重载形式:1.format(String format, Object... args) 新 ...

  7. 洛谷P2148 [SDOI2009]E&D(博弈论)

    洛谷题目传送门 先安利蒟蒻仍在施工的博弈论总结 首先根据题目,石子被两两分组了,于是根据SG定理,我们只要求出每一组的SG值再全部异或起来就好啦. 把每一对数看成一个ICG,首先,我们尝试构造游戏的状 ...

  8. sudALSA lib dlmisc.c:236:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_pulse.so

    我使用的系统是kali,默认的浏览器为iceweasel.默认的浏览器很好用!! 但是,给浏览器安装flash后,播放视频,会报错:有视频,无声音. 下面给出我的解决方案:

  9. ip更换

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  10. Linux上安装Perl模块的两种方法

    Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装.第一种方法是从CPAN上下载  您需要的模块,手工编译.安装.第二种方法是联上internet,使用一个叫做CPAN的模块自动完 ...