1. 用户空间与内核空间分段式布局如下截图:

对于pkmap / modules 与fixmap关系,这地方可能比较难以理解,请参考这三篇文章:

https://www.veryarm.com/119846.html
https://blog.csdn.net/michaelcao1980/article/details/43308811
https://www.cnblogs.com/arnoldlu/p/8068286.html

PKMAP_BASE是永久映射区的起始范围是[PAGE_OFFSET – 2MB,PAGE_OFFSET],对这里的arm设备就是[0xBFE00000,0xC0000000]
highmem pkmap虚拟空间共享模块区域的末端

swapper_pg_dir用于存放内核PGD页表的地方,赋给init_mm.pgd。

swapper_pg_dir被定义了绝对地址,在arch/arm/kernel/head.S中有如下定义。

swapper_pd_dir的大小为16KB,对应的虚拟地址空间是从0xc0004000 - 0xc0008000,物理地址空间是0x6000400~0x60008000

ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。

  1. hisi3519内核布局图如下:

这里面的地址都是虚拟地址,其中lowmem是线性映射区。
线性映射区的意思是0xc0000000 -0xef800000这段虚拟地址,和0x60000000 - 0x8f800000这段物理地址是一一对应的。
.text、.init、.data、.bss都属于lowmem区域,也即ZONE_NORMAL;vector、fixmap、vmalloc属于ZONE_HIGHMEM区域。
pkmap、modules属于用户空间(属于3G区间的内存布局范围)
pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
modules : 0xbf000000 - 0xbfe00000 ( 14 MB)

永久映射区始于PKMAP_BASE,但并非结束于FIXADDR_START,在文件arch/arm/include/asm/highmem.h中描述> 了永久映射区到底是在哪里:

#define PKMAP_BASE (PAGE_OFFSET - PMD_SIZE)

PKMAP_BASE是永久映射区的起始,在这里的arm设备中,PKMAP_BASE是在内核用户分界点之下2MB处,下面这个宏LAST_PKMAP标识永久映射区有多少个条目,注意每个条目是可以映射1页:

#define LAST_PKMAP PTRS_PER_PTE

在这里的arm设备中,LAST_PKMAP值为512,即512个条目,每个条目映射一页,即可最多映射4KB * 512 =
2MB大小,所以永久映射区的范围是[PAGE_OFFSET –
2MB,PAGE_OFFSET],对这里的arm设备就是[0xBFE00000,0xC0000000];这也证明了前面文章说的,高端内存空间不一定就是在high_memory之上的地址空间;


其中:boot占用1M, kernel占用4M, rootfs 占用59M

内存信息

物理地址空间的顶部以下一段空间,被PCI设备的I/O内存映射占据,它们的大小和布局由PCI规范所决定。640K~1M这段地址空间被BIOS和VGA适配器所占据。

Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。

进一步,针对不同的用途,Linux内核将所有的物理页面划分到3类内存管理区中,如图,分别为ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。

ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。

ZONE_NORMAL的范围是16M~896M,该区域的物理页面是内核能够直接使用的。

ZONE_HIGHMEM的范围是896M~结束,该区域即为高端内存,内核不能直接使用。

在kernel image下面有16M的内核空间用于DMA操作。位于内核空间高端的128M地址主要由3部分组成,分别为vmalloc
area,持久化内核映射区,临时内核映射区。

由于ZONE_NORMAL和内核线性空间存在直接映射关系,所以内核会将频繁使用的数据如kernel代码、GDT、IDT、PGD、mem_map数组等放在ZONE_NORMAL里。而将用户数据、页表(PT)等不常用数据放在ZONE_
HIGHMEM里,只在要访问这些数据时才建立映射关系(kmap())。比如,当内核要访问I/O设备存储空间时,就使用ioremap()将位于物理地址高端的mmio区内存映射到内核空间的vmalloc
area中,在使用完之后便断开映射关系。

hisi3519 内核虚拟内存布局原理图相关推荐

  1. android 分区layout以及虚拟内存布局-小结

    摘要 简述启动过程的内存分配,各个映像的烧写,加载,logo的刷新,文件系统mount. DRAM:外部RAM: ISRAM:内部RAM(128K),(PL会跑在ISRAM里面,去初始化DRAM,lo ...

  2. memory:arm 分区layout以及虚拟内存布局-小结

    2019独角兽企业重金招聘Python工程师标准>>> 摘要 简述启动过程的内存分配,各个映像的烧写,加载,logo的刷新,文件系统mount. DRAM:外部RAM: ISRAM: ...

  3. AOS虚拟内存布局、进程线程

    文章目录 前言 一.用户进程虚拟内存地址空间 二.tadm时间管理员之CPU调度 三.用户进程CPU虚拟设备v节点结构 四.processes virtual device进程虚拟设备v节点结构 总结 ...

  4. ARM64内核内存布局图

    ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间.对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址.虚拟地址也同样最大支持48位支持,所以在处理器的架构 ...

  5. 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

    文章目录 一.ARM64 架构体系内存分布 二.Linux 内核启动源码 start_kernel 三.内存初始化源码 mm_init 四.内存初始化源码 mem_init 一.ARM64 架构体系内 ...

  6. 鸿蒙轻内核虚拟内存基础知识:虚拟内存进程空间编号

    摘要:本文介绍了OpenHarmony鸿蒙轻内核LiteOS-A的虚拟地址空间编号知识,详细分析进程空间编号的申请与释放操作. 本文分享自华为云社区<鸿蒙轻内核A核源码分析系列四 (1) 虚拟内 ...

  7. 【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )

    文章目录 一.Linux 内核 动态分配内存 系统接口函数 二.统计输出 vmalloc 分配的内存 一.Linux 内核 动态分配内存 系统接口函数 Linux 内核 " 动态分配内存 & ...

  8. 【Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 /proc/meminfo 文件 | /proc/meminfo 重要字段解析 )

    文章目录 一.查看 x86_64 架构体系内存分布 二./proc/meminfo 重要字段解析 一.查看 x86_64 架构体系内存分布 执行 cat /proc/meminfo 命令 , 可以查看 ...

  9. linux内核虚拟内存之slub分配器

    上一章主要讲述以页为最小单位进行内存分配的伙伴管理算法,较大程度上避免了内存碎片问题.而实际上对内存的申请却不是每次都申请一个页面的(比如文件节点,任务描述符等结构体内存),通常是远小于一个内存页面的 ...

最新文章

  1. AIX的异步IO设置
  2. swagger 怎么去掉get delete_自学 Java 怎么入门?
  3. 图论--欧拉回路(模板)
  4. 宝塔面板php降级,宝塔面板6.8.8降级到5.9.1的方案教程
  5. 这个为生信学习打造的开源Linux/Bash教程真香!!!
  6. 基于android记事本论文,基于android平台的记事本研究与开发 开题报告
  7. lazarus的动态方法和虚拟方法
  8. 计算机网络期末4小时速成
  9. java调用考勤机_zkteco iface702 中控考勤机java开发步骤一---连接考勤机
  10. 电子招投标——电子投标书制作教程
  11. 火热报名|Apache Pulsar x KubeSphere 在线 Meetup 来袭
  12. CocoWu‘s Summer English Study Summery
  13. JSP前三章测试改错
  14. Codeforces - Serge and Dining Room
  15. redis加锁、解锁
  16. 发散性思维对养蜂技术的提高作用
  17. 给笔记本添加第二块显示屏
  18. 全国计算机二级等级考试2017,2017年全国计算机二级考试科目及内容
  19. C++计算时域数据的特征值(数据处理eigen)
  20. macbook 如何在开盖的情况下连接外接显示器, 同时 macbook 的键盘和触摸板都能工作

热门文章

  1. 链路聚合-VLAN原理和配置-VLAN间路由——总结
  2. ssm学生社团管理系统毕业设计源码
  3. RabbitMQ消息应答实战(针对自动|手动应答常见问题进行模拟)
  4. 外汇交易中的资金管理方案
  5. SpringBoot结合注解导入excel
  6. 【程序设计与算法(一)】MyMax
  7. Qt随手笔记(五)vs+qt使用QAxObject读取word(内容、句子、段落、表格)
  8. MySQL之DQL(数据查询语言)-常见关键字
  9. 密室逃脱18 迷宫题
  10. 思维导图——带你快速掌握信号与传输介质