您的位置:首页 > 运维架构 > Linux

嵌入式Linux-内存管理基础

2017-01-25 18:54 323 查看
嵌入式Linux-内存管理基础

一,内存管理简介

内存管理(Memory Manager)是时Linux内核中的一个非常重要的模块,学习Linux内核必须要了解内存。

下面是一张内存管理的经典模型图,它详细的介绍了内存管理的2个主要职能:

1.地址映射

2.内存分配



二,地址类型

1.物理地址

出现在CPU地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。

2.逻辑地址

代码经过编译后,在汇编代码中出现的汇编地址

3.虚拟地址

32bit Linux下有4G的虚拟地址空间,在Linux程序中使用的都是虚拟地址。

虚拟地址空间图:



4.线性地址

线性地址 = 虚拟地址

注意:因为Linux中所有段的基地址都为0, 在Linux中线性地址与逻辑地址相同。

因此在Linux中逻辑地址 = 线性地址 = 虚拟地址。

三,地址转换

在Linux地址转换的基本模式是:

逻辑地址 -> 段式管理单元转换 -> 线性地址(虚拟地址) -> 页式管理单元转换 -> 物理地址

可以看出转换的结果是将:逻辑地址转换为物理地址。

这个转化模式中我们已经了解了3个地址类型,下面介绍两种管理单元。

1.段式管理单元

段式管理单元是x86中的一个典型实现,是为了兼容8086那些CPU的设计,沿用到至今,这里只是介绍一些基本内容,如果你想更进一步的了解,我建议你去学习学习王爽老师<汇编语言>,非常好的一部书,通俗易懂。

因为8086是16Bit,而现在的CPU大多是32Bit,所以段式管理也要分16/32Bit来介绍了。

对于16Bit的CPU:逻辑地址 = 段地址 * 16 + 偏移地址

对于32Bit的CPU:现在的x86 CPU有两个模式,实模式和保护模式

实模式:就是一个虚拟的8086,所以它的分段机制与16Bit的相同,它的段地址 = 段寄存器 * 16

保护模式:我们在x86的CPU是运行OS时,多数情况下是运行在保护模式下的。它的分段机制就有很大的不同了,它的段寄存器里存储的是段选择符,用该选择符作为内存地址,该内存地址对应的就是32Bit的段地址

如图:



2.分页管理单元

:线性地址被分为固定长度的组,称为页,4KB或者8KB,一般都是4KB。

物理页(页框,页帧):实际的物理内存页,4KB。

如图:分页管理单元将线性地址映射到物理地址



下面是一个2级(页目录,页表)分页管理单元的地址转换模型图:



分页管理有下面一些特征

1.页目录地址放在CPU的cr3寄存器中。

2.每一个进程,都有其独立的虚拟地址空间,运行一个进程,首先需要将它的页目录地址放到cr3寄存器中,将其他进程的cr3寄存器的值保存下来。

3.每一个32位的线性地址被划分为三个部分:

页目录索引:[31, 22]Directory,10位

页表:[21, 12]Table,10位

偏移: [11, 0]Offset,12位

这是具体的转换步骤

1,装入进程页目录地址,操作系统在调度进程时,把这个地址装入CR3。

2.根据线性地址前十位,在页目录中,找到对应的索引项,页目录中的项是一个页表的基地址

3.根据线性地址的中间十位,在页表中找到页的起始地址

4.将页的起始地址与线性地址的最后12位偏移相加,得到物理地址。

四,总结

本次介绍内存管理相关的内容,这些基础知识对于学习内核来说非常重要,希望能帮助大家。

思维导图:



资料链接:链接:http://pan.baidu.com/s/1geAoCfh 密码:yx04
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: