聊一聊Linux假造内存技能
必要留意的是,页表是操纵体系建设的用于内存打点的表格。因此,一个措施在运行时,其页表也要存放到内存空间。假如一个措施只必要一个页表,则不会有什么题目。但假如,措施的假造空间很大的话,就会呈现一个较量大的题目。 好比:一个措施的假造空间为4GB,页表以4KB为一页,那么这个措施空间就是1M页。为了存储这1M页的页指针,那么这个页表的长度就相等大了,对内存的承担也很大了。以是,最好对页表也举办分页存储,在措施运行时只把必要的页复制到内存,而暂且不必要的页就让它留在辅存中。为了打点这些页表页,还要成立一个 记录页表页首地点的页目次表,于是单级页表就酿成了二级页表。二级页表的地点转换如下图所示: 虽然,假如措施的假造空间更大,那么也可以用三级页表来打点。为了具有通用性,Linux体系行使了三级页表布局:页目次(Page Directory,PGD)、中间页目次(Page Middle Directory,PMD)、页表(Page Table,PTE)。 Linux的页表布局 为了通用,Linux体系行使了三级页表布局:页目次、中间页目次和页表。PGD为 顶级页表,是一个pgdt数据范例的数组,每个数组元素指向一此中间页目次;PMD为 二级页表,是一个pmdt数据布局的数组,每个数组元素指向一个页表;PTE则是 页表,是一个pte_t数据范例的数组,每个元素中含有物理地点。 为了应用上的机动,Linux行使一系列的宏来袒护各类平台的细节。用户可以在设置文件 config中按照本身的必要对页表举办设置,以抉择是行使三级页表照旧行使二级页表。 在体系编译时,会按照设置文件 config中的设置,把目次 include/asm标记毗连到详细CPU专用的文件目次中。譬喻,对付i386CPU,该目次标记会毗连到include/asm-i386,并在文件pgable-2level-defs.h中界说了二级页表的根基布局,如下图: 个中还界说了:
在文件include/asm-i386/pgtable.h中界说了页目次和页表项的数据布局,如下:
从界说可知,它们都是只有一个 长整型范例(32位)的布局体。 留意:如上文的“页的掩护”部门,页框码代表物理地点,只必要高20位就够了(由于页框的长度为4KB,因此页内偏移12位)。尔后12位可以存放各个状态信息和会见权限。可是Linux并没有这样做,反而从头界说了一个布局体来存放,通过“或”运算来将两者团结。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |