如何解决操作系统如何按进程生成页表?
我知道每个进程都有自己的虚拟地址空间。每个进程都会生成一个表,用于将虚拟地址映射到驻留在物理内存(称为页面)中的物理地址。
在尝试访问说0x123
的地址时,使用表查找该地址。如果没有找到翻译,则生成segfault
。否则,返回翻译后的地址。 (为简单起见,这里我没有提及TLB和页面错误的作用。)
我的问题是,此表如何生成?我的程序开始运行时,如何知道0x123
应该映射到物理内存?是因为linker
在链接时已经将所需的地址添加到了二进制文件中?
解决方法
根据您的操作系统,将编写编译器和链接器以输出某些可执行格式。对于Windows计算机,它将输出.exe文件。对于Linux机器,它将输出elf文件,这是一种开放源代码约定(可执行和可链接格式)。
elf文件将包含几个段(代码,数据等),这些段需要驻留在虚拟地址空间中的某些位置才能正确地相互引用。
每个进程基本上都具有一个完整的虚拟地址空间,操作系统的工作是切换分页表并创建它们,以便虚拟地址可以转换到RAM中的某个位置,而不会打扰其他进程或主机。核心。使用多个处理器会变得更加复杂。
操作系统将根据可执行文件中引用的段的大小来映射必要的空间。操作系统决定了该过程真正在物理内存中的最终位置,因为这对于仅使用虚拟地址的过程是透明的。
如果进程进行动态内存分配,则该进程也可以向操作系统请求更多的内存。在这种情况下,它将使用其库专门为此操作系统编写。在运行时将进行动态链接或进行静态链接。静态链接会将所有必需的代码添加到可执行文件中,因此它将是独立的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。