文章目录

  • 一、虚拟地址空间布局架构
  • 二、用户虚拟地址空间划分

一、虚拟地址空间布局架构


在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 646464 位的虚拟地址 , 最大只支持 484848 位的虚拟地址 , 646464 位地址太大 , 并不需要那么大的内存空间 ;

" ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 " 是等同的 ;

  • 用户虚拟地址 : 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF , 484848 位有效地址 ;
  • 内核虚拟地址 : 0x FFFF 0000 0000 0000 ~ 0x FFFF FFFF FFFF FFFF , 484848 位有效地址 ;

二、用户虚拟地址空间划分


Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址 为 000 ;

" 用户虚拟空间 " 的大小为 TASK_SIZE , 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 TASK_SIZE 宏不同 ;

  • 323232 位处理器 定义的 TASK_SIZE 宏为 TASK_SIZE_32 , 该值为 0x100000000\rm 0x1000000000x100000000 字节 , 大约 4GB ;
#define TASK_SIZE_32     UL(0x100000000)
  • 646464 位处理器 定义的 TASK_SIZE 宏为 TASK_SIZE_64 该值为 2VA_BITS\rm 2^{VA\_BITS}2VA_BITS 字节 ;
#define TASK_SIZE_64     (UL(1) << VA_BITS)

在 Linux 内核源码的 LINUX-4.12\arch\arm64\include\asm\memory.h#86 中 , 定义了 TASK_SIZETASK_SIZE_64 宏 ;

VA_BITS 是编译内核时 , 选择的 " 虚拟地址空间 " 的地址位数 ,

TASK_SIZETASK_SIZE_64 宏 相关源码如下 :

/** PAGE_OFFSET - the virtual address of the start of the linear map (top*        (VA_BITS - 1))* KIMAGE_VADDR - the virtual address of the start of the kernel image* VA_BITS - the maximum number of bits for virtual addresses.* VA_START - the first kernel virtual address.* TASK_SIZE - the maximum size of a user space task.* TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area.*/
#define VA_BITS         (CONFIG_ARM64_VA_BITS)
#define VA_START        (UL(0xffffffffffffffff) << VA_BITS)
#define PAGE_OFFSET     (UL(0xffffffffffffffff) << (VA_BITS - 1))
#define KIMAGE_VADDR        (MODULES_END)
#define MODULES_END     (MODULES_VADDR + MODULES_VSIZE)
#define MODULES_VADDR       (VA_START + KASAN_SHADOW_SIZE)
#define MODULES_VSIZE       (SZ_128M)
#define VMEMMAP_START       (PAGE_OFFSET - VMEMMAP_SIZE)
#define PCI_IO_END      (VMEMMAP_START - SZ_2M)
#define PCI_IO_START        (PCI_IO_END - PCI_IO_SIZE)
#define FIXADDR_TOP     (PCI_IO_START - SZ_2M)
#define TASK_SIZE_64        (UL(1) << VA_BITS)#ifdef CONFIG_COMPAT
#define TASK_SIZE_32        UL(0x100000000)
#define TASK_SIZE       (test_thread_flag(TIF_32BIT) ? \TASK_SIZE_32 : TASK_SIZE_64)
#define TASK_SIZE_OF(tsk)   (test_tsk_thread_flag(tsk, TIF_32BIT) ? \TASK_SIZE_32 : TASK_SIZE_64)
#else
#define TASK_SIZE       TASK_SIZE_64
#endif /* CONFIG_COMPAT */

源码路径 : LINUX-4.12\arch\arm64\include\asm\memory.h#86

【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )相关推荐

  1. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

  2. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

  3. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  4. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

    文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...

  5. 【Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

    文章目录 一.物理地址空间 二.外围设备寄存器 三.外围设备寄存器物理地址 映射到 虚拟地址空间 一.物理地址空间 " 物理地址空间 " 是 CPU 处理器 在 " 总线 ...

  6. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  7. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  8. Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)

    Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...

  9. Linux内核内存管理(3):kmemcheck介绍

    Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...

最新文章

  1. 【每日DP】day12、P1063 能量项链(区间DP又一模板,震惊,只需要4行代码?)难度⭐⭐⭐
  2. GC rich的区域不易测序的原因
  3. 腾讯云CMQ消息队列在Windows环境下的使用
  4. 活动推荐 | 2019日立「视频分析技术黑客马拉松」报名启动,还有高额奖金等你赢...
  5. 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
  6. 成都七中实验学校爆食品安全问题,互联网+后勤能做点什么吗?
  7. Linux opencv安装与编译
  8. C# 读取指定目录中的所有文件,并按规则生成SQL语句!
  9. android 代码 shape,Android Shape控件美化实现代码
  10. 微信发ascii_微信公众平台开发(107) 分享到朋友圈和发送给好友
  11. UITableView上的iOS UIRefreshControl
  12. 【书籍推荐】《美国黒室》
  13. html制作相册影集,影集相册制作系统
  14. gpx文件解析 Demo
  15. 实现一个在线抽奖系统,就算是个小白看了也能做出来(附源码)
  16. 《分形艺术,当科学嫁给了艺术》作者:林晨 风达
  17. C++ string切割,分解字符串,C 库函数 - strtok()
  18. 渗透测试-微信刷票漏洞(IP伪造)
  19. 用二叉树表示家谱关系并实现各种查找功能
  20. DorisDB系列文档(三)基本原理

热门文章

  1. 【云栖大会】基因计算:解读生命的力量
  2. HDU2552 三足鼎立 【数学推理】
  3. 尚学堂requireJs课程---3、私有和公有属性和方法
  4. ES6--基础语法(一)
  5. 设计模式:迭代器模式
  6. PHP——分页显示数据库内容
  7. U盘安装Linux CentOS 6.5 64位操作系统(来自互联网)
  8. java中synchronized使用方法
  9. Ubuntu下查看命令的源码
  10. What you need to know about AllowUnsafeUpdates (Part 1) [转载]