目录
- 一、简介
- 二、内存空间定义
- 三、内存权限
- 四、内存空间映射图
- 4.1 32位系统
- 4.2 64位系统
- 4.3 映射空间解析
- 五、其他相关链接
- 1、关于linux下内存管理内容总结
- 2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解
- 3、Linux下stream内存带宽测试参数和示例详解附源码总结
一、简介
本文主要介绍内核和用户空间的物理地址到虚拟地址的映射,通过详细图解方便读者快速掌握。
二、内存空间定义
内核空间定义
内核空间是操作系统内核运行的区域,它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间通常是操作系统中的一块保护内存区域,只有操作系统内核才能够访问这个区域。
用户空间定义
用户空间是指用户应用程序运行的区域,包括用户应用程序代码、数据和堆栈等。
内核空间、用户空间的具体划分:针对 Linux 操作系统而言,最高的 1G 字节由内核使用,称为内核空间。而较低的 3G 字节由各个进程使用,称为用户空间。
以32位机器为例:
最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF);
较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)。
三、内存权限
1、内存访问权限不同
内核空间的内存访问权限比用户空间更高,因为内核需要访问整个系统的物理资源,例如设备驱动、中断处理程序等。
2、虚拟地址映射方式不同
用户空间的虚拟地址空间是由操作系统分配和管理的,它们通过页表映射到物理地址空间。而内核空间的虚拟地址空间是由内核自己管理的,它们不需要通过页表进行映射,而是直接映射到物理地址空间。
3、运行环境不同
内核空间是操作系统内核的运行环境,用户空间是应用程序的运行环境。
四、内存空间映射图
4.1 32位系统
3G用户态,1G内核态
4.2 64位系统
1.用户空间:0x0000 0000 0000 0000到0x0000 ffff ffff ffff,一共有256TB。
2.非规范区域。
3.内核空间:0xffff 0000 0000 0000到Oxffff ffff ffff ffff。一共有256TB.
4.3 映射空间解析
(1)线性映射区域的范围是[PAGE OFFSET,264-1],起始位置是PAGE OFFSET=(0xFFFFFFFF FFFF FFFF <<(VA BITS-1)),长度是内核虛拟地址空间的一半。称为线性映射区域的原因是虚拟地址和物理地址是线性关系:
虚拟地址=((物理地址-PHYS OFFSET)+PAGE OFFSET),:其中PHYS OFFSET是内存的起始物理地址。
内核空间又由线性映射、非线性映射区(包含vmaloc区、动态映射区、固定映射区)组成,我们kmalloc()/get free_page()分配内存就是从normal直接映射区的分配一片内核空间,这片空间的内存地址便是内核态虚拟地址,与物理内存构成线性偏移关系。表面是从直接映射区内核空间分配走一片内核虚拟空间,实际在读写这片内存时,读写对应的是构成映射关系的物理内存。
(2)固定映射区域的范围是[FIXADDR_START,FIXADDR_TOP),长度是FIXADDR_SIZE,结束地址是FIXADDR_TOP=(PCI I/O START-2MB)。
固定地址是编译时的特殊虚拟地址,编译的时候是一个常量,在内核初始化的时候映射到物理地址。
(3)vmalloc区域的范围是[VMALLOC_START_VMALLOC_END),起始地址是VMALLOC_START,等于内核模块区域的结束地址,结束地址是VMALLOC_END=(PAGE_OFFSET - PUD SIZE-VMEMMAP SIZE - 64KB),其中PUD SIZE是页上级目录表项映射的地址空间的长度。
vmalloc区域是函数vmalloc使用的虎拟地址空间内核使用vmalloc分配虚拟地址连续但物理地址不连续的内存。
内核镜像在vmalloc区域,起始虚拟地址是(KIMAGE_VADDR + TEXT OFFSET),其中
内核镜像在vmalloc区域,起始虚拟地址是(KIMAGE VADDR + TEXT OFFSET),其中KIMAGE VADDR是内核镜像的虚拟地址的基准值,等于内核模块区域的结束地址
MODULES END;TEXT OFFSET是内存中的内核镜像相对内存起始位置的偏移。
(6)内核模块区域的范围是[MODULES_VADDRMODULES END),长度是128MB,起始地址是MODULES_VADDR=(内核虚拟地址空间的起始地址 +KASAN影子区域的长度)。
内核模块区域是内核模块使用的虚拟地址空间,
(7)KASAN影子区域的起始地址是内核虚拟地址空间的起始地址,长度是内核虚拟地址空间长度的1/8。
内核地址消毒剂(KernelAddress SANitizer,KASAN)是一个动态的内存错误检查工具。它为发现释放后使用和越界访问这两类缺陷提供了快速和综合的解决方案。