2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 |

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

时间:2022-06-25 03:16:06

相关推荐

【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 ;

#define TASK_SIZE_32UL(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_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 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。