什么是虚拟地址空间?

虚拟地址空间

当计算机程序运行时,它需要访问一些内存,例如使用的变量或代码等。虚拟地址空间是一种使程序可以直接访问这些内存而不必真正了解这些内存在物理上所处的位置的技术。虚拟地址由处理器内存管理单元映射到实际物理地址。每个进程都有自己的独立虚拟地址空间,同时操作系统负责将每个进程的虚拟地址映射到主存中的物理内存地址。

虚拟地址空间为计算机提供了多个好处:

进程之间不会干扰彼此的虚拟地址空间,因此它们可以相互隔离。
虚拟地址空间使每个进程都有最大4GB(32位系统)或16EB(64位系统)可用的虚拟内存空间,尽管实际物理内存少于该数量,这样允许处理器利用虚拟内存空间存储更多数据。
虚拟内存把许多分散的小块整合成一个连续的地址范围, 优化了内存访问的速度。
虚拟地址空间允许各进程共享某些资源并提升系统的效率。
总的来说,虚拟地址空间是一种重要的内存管理技术,它允许计算机以更高效、可靠和安全的方式管理内存。

结合着Linux系统来再来理解一下这个概念

虚拟地址空间是一个进程看到的内存地址的集合,也是操作系统用来管理和保护内存的一组机制。在Linux中,通常将整个虚拟地址空间划分为两部分:用户空间和内核空间。

用户空间:这是运行在用户模式下程序所使用的区域。它的地址范围是根据处理器类型和操作系统版本而变化的,通常是从 0 开始(不包括空指针),直到最大用户空间地址。在32位的系统里,近似为 3GB,而在64位的系统里,则可以达到几十亿GB。另外,用户空间的上限还取决于进程映像文件的大小。
内核空间:这是操作系统内核所使用的区域,只能在内核执行完全特权指令时访问到。它包含了内核代码和数据结构等信息,以及一些与硬件操作相关的数据。在 x86 上,内核空间占用了系统总地址空间的最高区域,当物理内存越多时,留给用户空间的虚拟地址空间也就愈小了。
在 Linux 中,每个进程都有自己的虚拟地址空间,它是由内核为其划定的范围,并在进程创建时建立的。当进程调用 malloc() 或 calloc() 等函数时,会向操作系统请求申请新的内存区域。内存管理子系统会根据当前内存情况,在虚拟地址空间里为此保留一片尚未使用的地址区域。这个区域被称为“堆”(heap)。除此之外,虚拟地址空间还包括“共享库”、“栈”、“内存映射段”和“可执行映像”等区域,每种区域用于存储不同类型的数据。

你可能感兴趣的:(Linux,linux)