落花踏尽游何处,笑入胡姬酒肆中。这篇文章主要讲述Linux 内核 内存管理虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )相关的知识,希望能为你提供帮助。
文章目录
- ??一、虚拟地址空间布局架构??
- ??二、用户虚拟地址空间划分??
一、虚拟地址空间布局架构
在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 646464 位的虚拟地址 , 最大只支持 484848 位的虚拟地址 , 646464 位地址太大 , 并不需要那么大的内存空间 ;
" 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 操作系统 进程 的 " 用户虚拟空间 " 起始地址 为 000 ;
" 用户虚拟空间 " 的大小为 ?
?TASK_SIZE?
?? , 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 ??TASK_SIZE?
? 宏不同 ;
- 32 位处理器定义的?
?TASK_SIZE?
?? 宏为??TASK_SIZE_32?
? , 该值为0x100000000 字节 , 大约 4GB ;
#define TASK_SIZE_32UL(0x100000000)
- 64 位处理器定义的?
?TASK_SIZE?
?? 宏为??TASK_SIZE_64?
? 该值为2VA_BITS 字节 ;
#define TASK_SIZE_64(UL(1) < < VA_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_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 内核 内存管理虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )】
推荐阅读
- Redis(开发与运维):01---Redis简介特性使用场景使用建议历史版本
- Redis(开发与运维):03---Windows下安装Redis数据库
- Cluster介绍(集群) DRS介绍(分布式资源调度)EVC技术介绍
- Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓
- Redis(开发与运维):06---键的基本命令(KEYSSCANEXISTSRENAMEDELRANDOMKEYTYPEDBSIZE)
- N62-7
- Linux 内核 内存管理虚拟地址空间布局架构 ④ ( 内存描述符 mm_struct 结构体成员分析 | hiwater_rss | start_code | start_brk )
- Redis(开发与运维):04---Redis的启动连接/外网连接关闭可执行文件与配置参数大全
- 推荐--国内常用镜像站