返回

开启一段探索之旅:虚拟地址到物理地址的重排与分页奥秘

iOS

虚拟地址到物理地址:二进制重排与分页的奥秘

虚拟地址与物理地址的对应

计算机内存中有两种类型的地址:虚拟地址和物理地址。虚拟地址 是操作系统分配给每个进程的独立地址空间。它允许每个进程拥有自己的私有地址空间,而无需程序员担心物理内存的具体位置。物理地址 是指计算机物理内存中的实际地址。它由硬件电路决定,直接反映内存中的物理位置。虚拟地址到物理地址的转换是通过内存管理单元(MMU)完成的。MMU 根据页表将虚拟地址翻译成物理地址。

分页技术

为了有效地管理内存,计算机操作系统使用分页技术 。分页技术将内存划分为固定大小的页,并将每个进程的虚拟内存空间也划分为相同大小的页。当程序访问虚拟地址时,操作系统将虚拟地址的页号作为索引,在页表中找到对应的物理页号,并将其与虚拟页号的偏移量相加,得到物理地址。

分页技术具有以下优点

  • 提高内存利用率: 物理内存中的页可以被多个进程共享,从而提高内存利用率。
  • 简化内存管理: 操作系统只需管理页表即可,简化了内存管理。

但是,分页技术也存在一些缺点

  • 增加内存访问开销: 操作系统需要在每次访问内存时进行一次页表查询,增加了内存访问的开销。
  • 可能导致内存碎片: 当一个进程释放内存时,其占用的页可能无法被其他进程使用,导致内存碎片。

缺页中断

当程序访问一个不在物理内存中的页时,就会发生缺页中断 。此时,操作系统会将该页从磁盘加载到物理内存中,并重新启动被中断的程序。

处理过程:

  1. 操作系统在页表中查找对应的页表项。
  2. 如果页表项中没有相应的物理页号,则操作系统将该页从磁盘加载到物理内存中,并更新页表项。
  3. 操作系统重新启动被中断的程序。

内存分配原则

操作系统使用不同的算法来分配内存块给进程。最常见的内存分配原则包括:

  • 最佳适应原则: 将内存块分配给进程,使得剩余内存块的大小最小。
  • 最坏适应原则: 将内存块分配给进程,使得剩余内存块的大小最大。
  • 首次适应原则: 将内存块分配给进程,使得第一个找到的合适内存块被分配。

rebase

rebase 是一种技术,可以将一段代码或数据的虚拟地址从一个位置移动到另一个位置。

优点:

  • 允许代码或数据在不同的进程中共享。
  • 允许代码或数据在不同的内存区域中运行。

缺点:

  • 可能导致程序崩溃,因为程序中的绝对地址可能会被修改。
  • 可能导致程序运行速度变慢,因为程序需要重新加载到内存中。

代码示例

#include <stdio.h>
#include <stdlib.h>

int main()
{
  // 创建一个 10 MB 的数组
  int *array = malloc(10 * 1024 * 1024);

  // 打印数组的虚拟地址
  printf("虚拟地址:%p\n", array);

  // 使用 rebase 将数组的虚拟地址移动到另一个位置
  rebase(array, 0x80000000);

  // 再次打印数组的虚拟地址
  printf("重新分配后的虚拟地址:%p\n", array);

  return 0;
}

结论

虚拟地址到物理地址的二进制重排与分页是计算机系统中重要的概念。这些技术通过将虚拟内存抽象成一个连续的地址空间并巧妙地管理内存,优化了计算机性能。如果您正在学习计算机系统,了解这些概念对于理解内存管理至关重要。

常见问题解答

  1. 什么是虚拟地址?
    虚拟地址是操作系统分配给每个进程的独立地址空间。它允许每个进程拥有自己的私有地址空间,而无需程序员担心物理内存的具体位置。

  2. 什么是物理地址?
    物理地址是指计算机物理内存中的实际地址。它由硬件电路决定,直接反映内存中的物理位置。

  3. 分页技术如何工作?
    分页技术将内存划分为固定大小的页,并将每个进程的虚拟内存空间也划分为相同大小的页。当程序访问虚拟地址时,操作系统使用页表将虚拟地址翻译成物理地址。

  4. 什么是缺页中断?
    当程序访问一个不在物理内存中的页时,就会发生缺页中断。此时,操作系统会将该页从磁盘加载到物理内存中,并重新启动被中断的程序。

  5. rebase 是做什么用的?
    rebase是一种技术,可以将一段代码或数据的虚拟地址从一个位置移动到另一个位置。它允许代码或数据在不同的进程中共享或在不同的内存区域中运行。