ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-12-02 03:50:39  阅读:184  来源: 互联网

标签:operating-system memory-management linux x86


我对细分&在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有