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内存管理 - 页表的映射过程初步了解相关推荐

  1. Linux内存管理:反向映射机制(匿名页,文件页和ksm页)

    目录 1.反向映射的发展 2.反向映射应用场景 3.匿名页的反向映射 4.文件页的反向映射 5.ksm页的反向映射 6.总结 7.作者简介 8.推荐阅读 为了系统的安全性,Linux内核将各个用户进程 ...

  2. OPTEE的内存管理 :页表的创建过程

    关键词: optee.ATF.TF-A.Trustzone.optee3.14.MMU.VMSA.cache.TLB.arm.armv8.armv9.TEE.安全.内存管理.页表- 快速链接: .

  3. Linux内存管理之MMU的过程

    之前写过一篇<CPU是如何访问内存的?>的文章,简单介绍了cpu访问内存的过程.有了之前的感性认识,这篇站在arm的角度再深度讲解一下,看完你会发现不理解arm原理就直接撸内核代码简直是耍 ...

  4. Linux内存管理 (2)页表的映射过程

    专题:Linux内存管理专题 关键词:swapper_pd_dir.ARM PGD/PTE.Linux PGD/PTE.pgd_offset_k. Linux下的页表映射分为两种,一是Linux自身的 ...

  5. Linux内存管理之高端内存映射

    一:引子 我们在前面分析过,在linux内存管理中,内核使用3G->4G的地址空间,总共1G的大小.而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大 ...

  6. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    转载地址:https://blog.csdn.net/gatieme/article/details/52403148 日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Lin ...

  7. linux内存映射原理,Linux内存管理实践-使用fault()实现内存映射

    内核态与用户态进行数据交互通常是这样一种模型:内核利用自身的特权通过特定的服务程序采集.接收和处理数据:接着,用户态程序和内核服务程序进行数据交互,或接收内核态的数据,或向内核态写入数据.通过传统的那 ...

  8. 高端内存映射之kmap持久内核映射--Linux内存管理(二十)

    日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内 ...

  9. Linux内存管理(二)

    Linux内存管理之二:Linux在X86上的虚拟内存管理 本文档来自网络,并稍有改动. 前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的 ...

最新文章

  1. 2021年大数据Spark(三十五):SparkStreaming数据抽象 DStream
  2. linux内核cfs浅析
  3. 知识表示之二——产生式规则表示法
  4. 2. TypeScript笔记
  5. Oracle入门(十一)之SQL
  6. RUNOOB python练习题6 斐波那契数列
  7. Android之canvas详解
  8. 835 由于安全层无法对远程计算机进行身份验证_vscode 插件Remote-ssh远程wsl调试python
  9. java集合 线程安全
  10. python在类中创建线程
  11. 【机器学习】 - 决策树(西瓜数据集)
  12. Git Extension 合并分支
  13. 使用CSS更改hr标签的厚度
  14. GIC 介绍 (二)—gic400 使用
  15. Google Dremel数据模型详解(上)
  16. #717 Cut(倍增)
  17. 老雷socket编程之认识常用协议
  18. 请求因HTTP状态401失败:Unauthorized 的原因?
  19. MarsNFT :个人如何发行数字藏品?
  20. 2019中科大数学考研复试题(回忆版)

热门文章

  1. ubuntu 10.04源 更新源列表
  2. vw 前端_一行css代码轻松实现前端响应式布局(vw+rem)
  3. 常用基础参数PrintGCDetails回收前后对比讲解
  4. Use Asynchronous Apex
  5. bugku 成绩单 sqlmap工具的爆破
  6. Grpc C# 入门
  7. Chrome 插件开发-右键菜单开发实战演示,浏览器页面右键菜单选项设置,插件右键菜单点击插件名跳转主页设置
  8. PyQt5 技术篇-设置滚动条拉动位置,scrollArea滚动条位置设置方法。
  9. Python+selenium 自动化-基本环境搭建,调用selenium库访问百度查询天气实例演示
  10. sublime配置运行python文件的快捷键