微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

操作系统如何按进程生成页表?

如何解决操作系统如何按进程生成页表?

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

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

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

解决方法

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

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

每个进程基本上都具有一个完整的虚拟地址空间,操作系统的工作是切换分页表并创建它们,以便虚拟地址可以转换到RAM中的某个位置,而不会打扰其他进程或主机。核心。使用多个处理器会变得更加复杂。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。