gpt4 book ai didi

c - 为什么默认情况下不打包结构?

转载 作者:太空狗 更新时间:2023-10-29 11:12:54 25 4
gpt4 key购买 nike

在阅读 CERT C 编码标准时,我遇到了 DCL39-C其中讨论了为什么像 Linux 内核这样的东西由于信息泄漏而将解压的结构返回到用户空间通常不是一个好主意。

简而言之,默认情况下通常不会打包结构,并且结构成员之间的填充字节通常包含未初始化的数据,因此会导致信息泄漏。

为什么默认情况下不打包结构?我相信指南中提到它是针对特定体系结构的编译器的优化功能。为什么将结构对齐到特定字节大小更有效,因为它会浪费内存空间?

此外,为什么 C 标准没有指定请求打包结构的标准化方式?我可以使用 __attribute__((packed)) 询问 GCC,对于不同的编译器还有其他方法,但这似乎是一个很好的功能,可以作为标准的一部分。

最佳答案

数据通过平行线组(总线)在电子电路中传输。同样,电路本身也倾向于并联排列。并联组件之间的物理距离会增加桥接它们的任何交叉导线的电阻和电容。因此,此类桥接往往既昂贵又缓慢,计算机架构师尽可能避免使用它们。

未对齐的加载需要跨 channel 移动字节。一些 CPU(例如效率导向的 RISC)在物理上无法做到这一点,因为桥组件不存在。有些人会检测到这种情况,并以一两个周期为代价进行换道。其他人可以在不影响速度的情况下处理错位……假设分页内存不会增加其他问题。

还有另一个完全不同的问题。内存管理单元 (MMU) 位于 CPU 执行核心和内存总线之间,将程序可见的逻辑地址转换为内存芯片的物理地址。两个相邻的逻辑地址可能驻留在不同的芯片上。 MMU 针对一种访问只需要一次转换但未对齐的访问可能需要两次的常见情况进行了优化。

跨页边界的未对齐访问可能会引发异常,这在内核中可能是致命的。由于页面比较大,这种情况比较少见。它可能会逃避测试,并且可能是不确定的。

TL;DR:打包结构不应该用于事件程序状态,尤其是在内核中。它们可能用于序列化和通信,但安全使用是另一个问题。

关于c - 为什么默认情况下不打包结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35110239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com