【问题标题】:How are page tables generated by the operating system, per process?操作系统如何为每个进程生成页表?
【发布时间】:2020-09-18 19:30:46
【问题描述】:
我知道每个进程都有自己的虚拟地址空间。每个进程都会生成一个表,以将虚拟地址映射到驻留在物理内存(称为页)中的物理地址。
当试图访问一个地址比如0x123 时,会使用该表查找该地址。如果没有找到翻译,则生成segfault。否则返回翻译后的地址。 (为了简单起见,我没有提到 TLB 和页面错误的作用)。
我的问题是,这张表是如何生成的?当我的程序开始运行时,它如何知道0x123 应该映射到物理内存?是不是因为 linker 在链接时已经将所需的地址添加到二进制文件中?
【问题讨论】:
标签:
memory
memory-management
paging
virtual-address-space
【解决方案1】:
根据您的操作系统,将编写编译器和链接器以输出某些可执行格式。对于 Windows 机器,它将输出 .exe 文件。对于 Linux 机器,它将输出 elf 文件,这是一种开源约定(可执行和可链接格式)。
elf 文件将包含几个段(代码、数据等),这些段需要驻留在虚拟地址空间中的某些位置才能正确地相互引用。
基本上每个进程都有一个完整的虚拟地址空间,操作系统的工作是切换分页表并创建它们,以便虚拟地址将转换到 RAM 中不会打扰其他进程或核心。使用多个处理器会变得更加复杂。
操作系统将根据可执行文件中引用的段的大小映射必要的空间。操作系统决定进程在物理内存中的真正结束位置,因为这对于只使用虚拟地址的进程是透明的。
如果进程进行动态内存分配,它也可以向操作系统请求更多内存。在这种情况下,它将使用其库专门为此操作系统编写。在运行时将有动态链接或静态链接。静态链接会将所有必要的代码添加到可执行文件中,因此它将是独立的。