【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
【摘要】
文章目录
一、虚拟地址空间布局架构二、用户虚拟地址空间划分
一、虚拟地址空间布局架构
在
64...
一、虚拟地址空间布局架构
在 64 64 64 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 64 64 64 位的虚拟地址 , 最大只支持 48 48 48 位的虚拟地址 , 64 64 64 位地址太大 , 并不需要那么大的内存空间 ;
" ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 " 是等同的 ;
- 用户虚拟地址 :
0x 0000 0000 0000 0000
~0x 0000 FFFF FFFF FFFF
, 48 48 48 位有效地址 ; - 内核虚拟地址 :
0x FFFF 0000 0000 0000
~0x FFFF FFFF FFFF FFFF
, 48 48 48 位有效地址 ;
二、用户虚拟地址空间划分
Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址 为 0 0 0 ;
" 用户虚拟空间 " 的大小为 TASK_SIZE
, 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 TASK_SIZE
宏不同 ;
- 32 32 32 位处理器 定义的
TASK_SIZE
宏为TASK_SIZE_32
, 该值为 0 x 100000000 \rm 0x100000000 0x100000000 字节 , 大约 4GB ;
#define TASK_SIZE_32 UL(0x100000000)
- 1
- 64 64 64 位处理器 定义的
TASK_SIZE
宏为TASK_SIZE_64
该值为 2 V A _ B I T S \rm 2^{VA\_BITS} 2VA_BITS 字节 ;
#define TASK_SIZE_64 (UL(1) << VA_BITS)
- 1
在 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 */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
源码路径 : LINUX-4.12\arch\arm64\include\asm\memory.h#86
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/124036675
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)