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

落花踏尽游何处,笑入胡姬酒肆中。这篇文章主要讲述Linux 内核 内存管理虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )相关的知识,希望能为你提供帮助。




文章目录

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










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

在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 646464 位的虚拟地址 , 最大只支持 484848 位的虚拟地址 , 646464 位地址太大 , 并不需要那么大的内存空间 ;
" ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 " 是等同的 ;
  • 用户虚拟地址 :??0x 0000 0000 0000 0000??? ~??0x 0000 FFFF FFFF FFFF?? , 48 位有效地址 ;
  • 内核虚拟地址 :??0x FFFF 0000 0000 0000??? ~??0x FFFF FFFF FFFF FFFF?? , 48 位有效地址 ;











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

Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址 为 000 ;
" 用户虚拟空间 " 的大小为 ??TASK_SIZE??? , 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 ??TASK_SIZE?? 宏不同 ;
  • 32 位处理器定义的??TASK_SIZE??? 宏为??TASK_SIZE_32?? , 该值为0x100000000 字节 , 大约 4GB ;
#define TASK_SIZE_32UL(0x100000000)

  • 64 位处理器定义的??TASK_SIZE??? 宏为??TASK_SIZE_64?? 该值为2VA_BITS 字节 ;
#define TASK_SIZE_64(UL(1) < < VA_BITS)





在 Linux 内核源码的 LINUX-4.12\\arch\\arm64\\include\\asm\\memory.h#86 中 , 定义了 ??TASK_SIZE??? 与 ??TASK_SIZE_64?? 宏 ;
??VA_BITS?? 是编译内核时 , 选择的 " 虚拟地址空间 " 的地址位数 ,




??TASK_SIZE??? 与 ??TASK_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_32UL(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_SIZETASK_SIZE_64
#endif /* CONFIG_COMPAT */

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


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


    推荐阅读