结构与数组的对齐规则冲突

问题描述 投票:0回答:1

正如标题所暗示的,问题与Linux上x86-64中聚合类型的对齐

在我们的演讲中,教授介绍了结构(及其元素)与所附幻灯片的对齐方式。因此,我将假设(根据Wikipedia和其他讲义材料)对于任何聚合类型,其对齐方式均取决于其最大成员。不幸的是,在以前的考试问题中似乎并非如此,它说:

“假定每个页表[4kB,每个PTE 64b]存储在内存中位于“自然对齐”的物理地址(即表大小的整数倍),...“

对于页表(为什么afaik基本上是内存中的8个字节值的数组),对齐规则不是根据最大的元素,而是根据整个表的大小?

澄清非常感谢!费利克斯Lecture slide

struct x86 alignment
1个回答
0
投票

为什么页表的大小对齐

对于转换虚拟地址的过程中的给定级别,要求将当前页表的大小按字节对齐以加快索引操作。CPU不需要执行实际的加法运算即可找到下一级页表的基址,它可以缩放索引,然后替换当前层级基址中的最低位。

您可以通过几个示例使自己确信这是事实。x86也遵循这种对齐方式并非偶然。

例如,对于x86 CPU的4KiB页面的4级分页,64位地址的页面目录指针字段为9位宽。该表中的每个条目(一个PDPTE)均为64位,因此页面大小为4096KiB,最后一个条目的偏移为511 * 8 = 4088(十六进制为0xff8,因此最多仅使用12位)。页面目录指针表的地址由PML4条目提供,这些条目未指定基数的低12位(用于其他目的),而仅指定高位。然后,CPU可以简单地用PDPTE的偏移量替换PML4条目中的低12位,因为我们已经看到它的大小为12位。

这在硬件上是快速且便宜的(没有进位,易于通过寄存器完成)。

假设一个国家的邮政编码由两个字段组成:城市代码(C)和区号(D)加在一起。另外,假设给定城市最多可以有100个分组代码,因此D为2位数字。要求城市代码与100对齐(这意味着C的最后两位为零)使C + D像用D替换C的最后两位。(1200 + 34 = 12 | 34)。

与聚合的对齐关系

页表不被视为一个汇总,即一个8字节元素的数组。它被认为是其自身的一种,由CPU的ISA定义,并且必须满足使用它的CPU特定部分的要求。页面浏览器发现将页面表按其大小对齐很方便,因此这是必需的。

聚合的对齐方式是编译器用来在内存中分配对象的一组规则,它保证满足每个元素对齐方式,以便instructions可以访问任何元素而不会受到对齐方式惩罚/故障。加载和存储的执行单元与页面漫游器是CPU的不同部分,因此需求不同。

您应该使用聚集对齐方式来知道编译器如何对齐结构然后检查是否足以满足您的用例

存在例外

[请注意,教授在解释其自然边界对页表的意义方面走了很长一段路。存在例外,如果告知您必须在X上对齐基准,则可以假定涉及一些硬件技巧/简化,并尝试查看哪一个,但最后您只需要进行对齐并继续进行即可。

© www.soinside.com 2019 - 2024. All rights reserved.