【发布时间】:2016-09-20 15:57:59
【问题描述】:
我正在阅读一些关于未对齐内存访问问题的文章并参考了这篇文章UNALIGNED MEMORY ACCESSES
bool ether_addr_equal(const u8 *addr1, const u8 *addr2) { #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 fold = ((*(const u32 *)addr1) ^ (*(const u32 *)addr2)) | ((*(const u16 *)(addr1 + 4)) ^ (*(const u16 *)(addr2 + 4))); return fold == 0; #else const u16 *a = (const u16 *)addr1; const u16 *b = (const u16 *)addr2; return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0; #endif }
它说:
但是当硬件不是 能够访问任意边界上的内存,对 a[0] 的引用导致 从地址 addr1 开始的内存中读取 2 个字节(16 位)。
好吧,我不知道这意味着什么。在我看来,a[0] 必须从 addr1 读取 2 个字节,如果不是,它将读取什么? (可能会崩溃,但我认为这是 2 个字节或没有的情况)。那么这里会出现什么问题呢?而他们为什么不使用u8*,逐字节比较来解决未对齐的问题呢?
【问题讨论】:
标签: c linux linux-kernel linux-device-driver