什么是虚拟地址空间
在计算机系统中,每个进程都有自己的虚拟地址空间。虚拟地址空间是一个虚构的地址空间,是给进程使用的,每个进程都认为自己能够拥有整个虚拟地址空间。当程序需要访问内存时,会使用虚拟地址,而不是物理地址。操作系统的内存管理单元会将虚拟地址转换为物理地址,并将对应的数据或指令加载到内存中。
虚拟地址空间的大小
一个进程的虚拟地址空间的大小取决于它所在的操作系统和硬件平台。不同的操作系统和硬件平台有不同的虚拟地址空间大小限制。
在32位操作系统中,每个进程能够拥有4GB的虚拟地址空间。这4GB的地址空间通常被划分为操作系统内核空间和用户空间。操作系统内核空间一般为1GB,用户空间为3GB。在64位操作系统中,每个进程拥有的虚拟地址空间大小可以达到16EB (exabyte),是非常巨大的。
虚拟地址空间的划分
在32位系统中,整个虚拟地址空间被划分为两个部分:内核空间和用户空间。用户空间是给用户态程序使用的,而内核空间是给操作系统使用的。内核空间在每个进程中都是相同的,通常被映射到虚拟地址空间的最高处。用户空间则是每个进程独有的,通常被映射到虚拟地址空间的最低处。用户空间中的进程可以访问自己的堆、栈、BSS、数据段等区域。
在64位系统中,虚拟地址空间被划分的更为复杂,多个区域可能会并存。例如,Linux下64位系统将整个虚拟地址空间划分为数个部分:用户空间,内核空间,直接映射区域,和PTE(page table entry)映射区域。用户空间和内核空间的划分与32位系统类似,而直接映射区域用于指针运算、共享内存等需求,PTE映射区域则用于页表等数据结构。
虚拟地址空间的扩充
在32位系统中,当一个进程需要更多的内存时,它可以通过不停地调用brk()或mmap()等函数来扩充自己的堆和映射新内存。这些内存块会被映射到用户空间的虚拟地址空间中。
在64位系统中,虚拟地址空间已经足够大,可以满足大部分应用程序的需求。在极少数情况下,程序需要超出64位虚拟地址空间的内存,这时候可以开启hugepage支持,利用大页表可以扩大虚拟地址空间大小。
虚拟地址空间是一个计算机系统中非常重要的概念。它允许多个进程并发地运行在计算机上,而不必担心内存资源被不合理地分配。理解虚拟地址空间的大小和划分对于操作系统开发和内存管理至关重要。