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

举报
韩曙亮 发表于 2022/04/09 00:19:55 2022/04/09
【摘要】 文章目录 一、虚拟地址空间布局架构二、用户虚拟地址空间划分 一、虚拟地址空间布局架构 在 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_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 */

  
 
  • 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。