虚拟内存大小:
1、对于32位系统,最大能够选址4G,其中用户态虚拟地址空间是3G,内核态是1G。
2、对于64位系统,虚拟地址只使用了48位。就像代码中写的一样,1左移了47位,就相当于48位地址空间一半的位置,0x0000800000000000,然后减去一个页,就是0x00007FFFFFFFF000,共128T。同样,内核空间也是128T。内核空间和用户空间之间隔着很大的空隙,以此来隔离
虚拟内存与物理内存映射关系:
3、操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存
4、内存用页来表示,一个页大小为4K,在内核中一个物理页用一个struct page表示。
虚拟地址分布情况
用户空间:
5、
(1) 代码段.text:存放程序执行代码的一块内存区域。只读,代码段的头部还会包含一些只读的常数变量。
(2)数据段.data:存放程序中已初始化的全局变量和静态变量的一块内存区域。
(3)BSS 段.bss:存放程序中未初始化的全局变量和静态变量的一块内存区域。
(4) 堆区:程序运行时动态申请内存用。堆从低地址向高地址增长。
(5) 栈区:存储局部变量,函数参数、返回值。栈从高地址向低地址增长。是一块连续的空间。
(6)内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
内核空间:
DMA区、常规区(NORMAL)、高位区(HIGHMEN)。
ZONE_ DMA: 可以用来DMA操作的页。 ZONE_NORMAL :正常规则映射的页。
ZONE_ HIGHMEM: 高内存地址的页,并不永久性映射。 ( >896MB)
内核空间只能使用最大1G物理内存,高端内存可以映射更多的物理内存