【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
生活随笔
收集整理的这篇文章主要介绍了
【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- 一、虚拟地址空间布局架构
- 二、用户虚拟地址空间划分
一、虚拟地址空间布局架构
在 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 ;
- 646464 位处理器 定义的 TASK_SIZE 宏为 TASK_SIZE_64 该值为 2VA_BITS\rm 2^{VA\_BITS}2VA_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_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
《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【Linux 内核 内存管理】内存管理架
- 下一篇: 【Linux 内核 内存管理】虚拟地址空