系统相关
首页 > 系统相关> > linux-根据页面分割内存的程序寿命

linux-根据页面分割内存的程序寿命

作者:互联网

我对细分&在x86 linux计算机上进行分页.如果有人弄清楚从头到尾的所有步骤,我们将非常高兴.

x86使用分页分段内存技术进行内存管理.

请问谁能说明从硬盘上的可执行.elf格式文件加载到主存储器到死之前发生的情况.编译时,可执行文件中包含不同的部分(文本,数据,堆栈,堆,bss).如何加载?如何使用分页分段存储技术设置它们.

是否想知道如何为已加载的程序设置页表?想知道如何建立GDT表.寄存器如何加载?以及为什么当它是32位机器时,逻辑地址(由MMU的分割单元处理的逻辑地址为48位(段选择器的16位为32位偏移)),将如何存储其他16位?从ram访问的东西必须是32位或4字节,如何访问其余的16位(加载到段寄存器中)?

提前致谢.这个问题可能有很多事情.但想弄清楚可执行文件的整个生命周期.如果能找到答案并对此进行讨论,将非常高兴.

解决方法:

没有页面分割之类的东西,至少在官方文档中没有.有两种不同的机制协同工作,或多或少彼此独立:

>将16位段选择器值形式的逻辑地址转换为:16/32/64位段偏移值,即将两个2对数字转换为32/64位虚拟地址.
>将虚拟地址转换为32/64位物理地址.

逻辑地址是您的应用程序直接使用的地址.然后按照上述两步将它们转换为RAM将理解的物理地址.

第一步,GDT(或者可以是LDT,取决于选择器的值)被选择器索引,以找到相关段的基址和大小.虚拟地址将是段基地址和偏移量的总和.段保护符需要段大小和段描述符中的其他内容.

在第二步中,通过虚拟地址的不同部分对页表进行索引,并且层次结构中的最后一个索引表提供了最终的物理地址,该地址在地址总线上输出以供RAM查看.就像段描述符一样,页表条目不仅包含地址,还包含保护控制位.

关于机制.

现在,在许多x86操作系统中,用于应用程序的段选择器是固定的,它们在所有选择器中都是相同的,它们从未改变,它们指向基地址等于0并且大小等于可能的最大值的段描述符(例如在非64位模式下为4GB).这样的GDT设置有效地意味着第一步没有做任何有用的工作,并且逻辑地址的偏移量部分转换为数值上相等的虚拟地址.

这使得段选择器值实际上无用.它们仍然必须加载到CPU的段寄存器中(在非64位模式下,至少应加载到CS,SS,DS和ES中),但是在此之后,它们可能会被遗忘.

所有这些(与Linux有关的详细信息和ELF格式除外)都在Intel和AMD的x86 CPU手册中进行了解释或直接遵循.您将在此处找到更多详细信息.

标签:operating-system,memory-management,linux,x86
来源: https://codeday.me/bug/20191202/2085722.html