Linux内存管理 - 页表的映射过程初步了解

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存管理 - 页表的映射过程初步了解相关的知识,希望对你有一定的参考价值。

Linux下的页表映射分为两种,一是Linux自身的页表映射,另一种是ARM32 MMU硬件的映射。

为什么会分两种;看一下什么是MMU;

MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。
它负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制;

MMU位于处理器内核和连接高速缓存以及物理存储器的总线之间。当处理器内核取指令或者存取数据的时候,都会提供一个有效地址(effective address),或者称为逻辑地址、虚拟地址。这个地址是可执行代码在编译的时候由链接器生成的。有效地址不需要和系统的实际硬件物理地址相匹配,而是通过MMU将有效地址映射成对应的物理地址,以访问指令和数据。

很早时候的电脑有没有MMU,记不清;很早期还没虚拟地址的概念;按资料说,实际上MMU是为满足操作系统越来越复杂的内存管理而产生的;

1. ARM32页表映射
 由于ARM32和Linux内核维护的页表项有所不同,所以维护了两套PTE。

PGD存放在swapper_pd_dir中,一个PGD目录项其实包含了两份ARM32 PGD。

所以再分配PTE的时候,共分配了1024个PTE,512个给Linux OS维护用;512个给ARM32 MMU用,对应两个PGD的页表数目。

1.1 ARM32处理器查询页表

32bit的Linux采用三级映射:PGD-->PMD-->PTE,64bit的Linux采用四级映射:PGD-->PUD-->PMD-->PTE,多了个PUD。

缩写是PGD:Page Global Directory、PUD:Page Upper Directory、PMD:Page Middle Directory、PTE:Page Table Entry。

1.2 Linux页表映射相关数据结构

我们知道在map_lowmem()使用create_mapping()创建页表映射,这个函数的参数结构是struct map_desc。

下面来研究它的相关结构,有助于理解内核是如何处理页表映射的。

arch\\arm\\include\\asm\\mach\\map.h:

struct map_desc {
    unsigned long virtual;------虚拟地址起始地址
    unsigned long pfn;----------物理地址开始页帧号
    unsigned long length;-------内存空间大小
    unsigned int type;----------mem_types中的序号
};

......

以上是关于Linux内存管理 - 页表的映射过程初步了解的主要内容,如果未能解决你的问题,请参考以下文章

linux kernel 内存管理-页表、TLB

linux为啥要采用三级页表?该机制如何工作

arm-linux内存管理学习笔记-内核临时页表的建立

嵌入式 linux基于arm中,其中的 内存映射 是啥意思?具体完成啥过程?一定采纳

arm-linux内存管理学习笔记-内存页表的硬件原理

arm-linux内存管理学习笔记-内存页表的硬件原理