文档章节

Linux的内存管理

刘女士zh
 刘女士zh
发布于 2017/07/21 16:47
字数 1032
阅读 13
收藏 0

         Linux的进程虚拟空间为4G,内核空间为1G,用户空间为3G。在Linux的内存管理中,所有进程共享内核空间,各自拥有自己的用户空间。如图1所示

               

图1

         虽然系统空间占据了1G,但是在物理的内存中却总是从0开始,所以,系统空间到物理地址上的映射是简单的线性映射,0xC0000000是两者之间的偏移量。   即:物理地址=虚拟地址+偏移量。

        下面讲讲用户空间到物理地址空间上的映射。

一、分段管理

        在分段管理中,Intel在8086 CPU系列中设置了4个段寄存器:CS、DS、SS和ES,分别用于可执行代码即指令、数据、堆栈和其他。每个段寄存器是16位,对应于地址总线的高16位。每条访内指令中的内部指令是16位,但是在送上地址总线之前CPU全部会自动的与某个寄存器中的内容相加。形成一个20位的实际地址。这样就实现了内部地址到实际地址的转换或说“映射”。------------实模式

实地址模式:8086/8088系列处理在早期的时候采用的是这种管理模式。没有地址空间的保护机制。

因为实模式的地址映射没有安全机制,所以Intel又实现了保护模式的地址映射。

保护模式保留了实模式下的4个段寄存器,并且还增加了两个段寄存器FS和GS。在保护模式下,基地址已经升级位一个包含基地址,地址长度和其他一些信息的数据结构的指针。为了防止不具备特权的用户程序通过玩弄某些诡计而改变内核和用户空间。在80386CPU中增设了两个寄存器:一个是全局性的段描述符表寄存器(GDTR)和局部性段描述符表寄存器(LDTR),分别可以用来指向存储在内存中的一个段描述符结构数组,或称段描述符表。每个段描述符为8字节。

在此基础上,段寄存器的高13位用作访问段描述符表中具体描述结构的下标。如图2所示:

13位下标 TI RPL

TI:0表示使用的是GDTR,1表示使用的是LDTR

 RPL:表示特权级别,00表示最高级别,11表示最低级别 

13位表下标:表示从8192个段描述符表项中选择一个描述符。

GDTR或LDTR中的描述符表指针和段寄存器中给出的下标结合在一起,才决定了具体的段描述符表项在内存中的什么地方,也可以理解成,将段寄存器内容的低3位屏蔽掉以后与GDTR或LDTR中的基地址相加得到描述符表项的起始地址。每个段描述表项的大小是8字节。每个描述符表项含有段的基地址和段的大小和其它一些信息。8字节段描述符表项的定义如下图所示:

二、页式存储管理结构

    linux的内存管理结构是分段和分页两个结合来实现的。因为保护模式下的分段管理的系统结构决定了分页管理的结构,所以,分页管理的线性地址是通过分段管理映射而来的。

   每页的大小为4K,一旦启用了页式存管,所有的线性地址都要经过页式映射,连GDTR和LDTR给出的段描述表项起始地址也不例外的。在页式存管中对线性地址的重新定义如下:

页面目录 页面表    页内偏移offset

    在页式存管中,又增加了一个新的寄存器CR3,用来存放页目录表项的基地址。从线性地址到物理地址的映射过层如下图1.5:

© 著作权归作者所有

共有 人打赏支持
刘女士zh
粉丝 0
博文 1
码字总数 1032
作品 0
萍乡
深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo
04/20
0
0
聊聊:Linux的内存管理机制

导读 经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。 这是Linux内存管理的一个...

问题终结者
今天
0
0
Linux与Android的关系

大家都知道Android是基于Linux内核的操作系统,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android和Linux之间的关系,后续还会讲到Android系...

开心303
2011/08/03
0
0
Linux小知识-5:内核结构

Linux内核主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。 稍微加以理解:CPU资源——内存资源——外存资源——外部资源——通信。 进程调度(SCHED):控制进...

lp_king
2013/09/28
0
0
Linux内存管理(简洁概括)

虚拟内存是为了满足物理内存不足采用的策略,利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的空间也就是交换分区。 作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的逻辑内存,...

Taisuke
2014/06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 容器实现对bean的管理(注解方式解析,源码阅读)

因为最近在研究学习spring boot,所以这里想详细学习回顾了一下spring 容器对bean的一些管理方式和部分源码学习。 首先初始类AnnotationConfigApplicationContext,简单源码查看,支持两个参...

小海bug
14分钟前
0
0
数据结构:二分查找 java

二分查找的前提是有序存储,利用顺序存储和元素排序 /** * 二分查找,查找成功,返回下标记 * @param values * @param begin * @param end * @param key * @param <T> * @ret...

京一
32分钟前
0
0
@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
45分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
今天
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部