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中的序号
};

......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值