Memory 每个进程的页面表是如何由操作系统生成的?

Memory 每个进程的页面表是如何由操作系统生成的?,memory,memory-management,paging,virtual-address-space,Memory,Memory Management,Paging,Virtual Address Space,我知道每个进程都有自己的虚拟地址空间。每个进程生成一个表,将虚拟地址映射到驻留在物理内存中的物理地址(称为页) 当尝试访问地址时,例如0x123,将使用表查找该地址。如果未找到翻译,则生成一个segfault。否则将返回翻译后的地址。(为了简单起见,这里我没有提到TLB和页面错误的作用) 我的问题是,这个表是如何生成的?当我的程序开始运行时,它如何知道应该将0x123映射到物理内存?是否因为链接器在链接时已将所需地址添加到二进制文件中?根据您的操作系统,编译器和链接器将被写入以输出某些可执行格式

我知道每个进程都有自己的虚拟地址空间。每个进程生成一个表,将虚拟地址映射到驻留在物理内存中的物理地址(称为页)

当尝试访问地址时,例如
0x123
,将使用表查找该地址。如果未找到翻译,则生成一个
segfault
。否则将返回翻译后的地址。(为了简单起见,这里我没有提到TLB和页面错误的作用)


我的问题是,这个表是如何生成的?当我的程序开始运行时,它如何知道应该将
0x123
映射到物理内存?是否因为链接器在链接时已将所需地址添加到二进制文件中?

根据您的操作系统,编译器和链接器将被写入以输出某些可执行格式。对于Windows计算机,它将输出.exe文件。对于Linux机器,它将输出elf文件,这是一种开源约定(可执行和可链接格式)

elf文件将包含多个段(代码、数据等),这些段需要驻留在虚拟地址空间中的某些位置,以便正确地相互引用

每个进程基本上都有一个完整的虚拟地址空间,操作系统的任务是切换分页表并创建它们,这样虚拟地址将转换到RAM中的某个地方,而不会影响其他进程或内核。使用多个处理器会变得更复杂

操作系统将根据可执行文件中引用的段的大小映射必要的空间。操作系统决定进程在物理内存中的最终位置,因为这对只使用虚拟地址的进程是透明的


如果进程执行动态内存分配,那么它也可以向操作系统请求更多内存。在这种情况下,它将使用其库专门为此操作系统编写。运行时将有动态链接或静态链接。静态链接将向可执行文件添加所有必要的代码,使其独立。

根据您的操作系统,编译器和链接器将被写入以输出某些可执行文件格式。对于Windows计算机,它将输出.exe文件。对于Linux机器,它将输出elf文件,这是一种开源约定(可执行和可链接格式)

elf文件将包含多个段(代码、数据等),这些段需要驻留在虚拟地址空间中的某些位置,以便正确地相互引用

每个进程基本上都有一个完整的虚拟地址空间,操作系统的任务是切换分页表并创建它们,这样虚拟地址将转换到RAM中的某个地方,而不会影响其他进程或内核。使用多个处理器会变得更复杂

操作系统将根据可执行文件中引用的段的大小映射必要的空间。操作系统决定进程在物理内存中的最终位置,因为这对只使用虚拟地址的进程是透明的

如果进程执行动态内存分配,那么它也可以向操作系统请求更多内存。在这种情况下,它将使用其库专门为此操作系统编写。运行时将有动态链接或静态链接。静态链接将向可执行文件添加所有必要的代码,使其独立