嵌入式Linux-内存管理基础

来源:互联网 发布:ubuntu vi命令 编辑:程序博客网 时间:2024/05/26 07:29

嵌入式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

0 0
原创粉丝点击