前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

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

作者头像
韩曙亮
发布2023-03-30 14:19:46
7.1K0
发布2023-03-30 14:19:46
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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


64

位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持

64

位的虚拟地址 , 最大只支持

48

位的虚拟地址 ,

64

位地址太大 , 并不需要那么大的内存空间 ;

" 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 操作系统 进程 的 " 用户虚拟空间 " 起始地址 为

0

;

" 用户虚拟空间 " 的大小为 TASK_SIZE , 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 TASK_SIZE 宏不同 ;

32

位处理器 定义的 TASK_SIZE 宏为 TASK_SIZE_32 , 该值为

\rm 0x100000000

字节 , 大约 4GB ;

代码语言:javascript
复制
#define TASK_SIZE_32		UL(0x100000000)
64

位处理器 定义的 TASK_SIZE 宏为 TASK_SIZE_64 该值为

\rm 2^{VA\_BITS}

字节 ;

代码语言:javascript
复制
#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 宏 相关源码如下 :

代码语言:javascript
复制
/*
 * 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、虚拟地址空间布局架构
  • 二、用户虚拟地址空间划分
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档