关于ether_addr_equal函数的未调整的问题?

我正在阅读一些关于未alignment的内存访问问题的文章,并提到了这篇文章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 } 

它说:

但是,当硬件无法访问任意边界上的内存时,对地址[addr]开始的[0]引用将导致从内存中读取2个字节(16位)。

那么,我不知道这是什么意思。 在我看来, a[0]必须从addr1读取2个字节,如果不是,将读取什么? (可能会崩溃,但它是一个2字节或没有任何情况,我认为)。 那么这里会发生什么问题呢? 为什么他们不使用u8*并比较一个字节一个字节来解决未alignment的问题?

在我看来,一个[0]必须从addr1读取2个字节,如果不是,将读取什么? 那么这里会发生什么问题呢?

当然意思是, a[0]使用一个2字节的访问从addr1读取一个字节,从addr1 + 1读取一个字节。 系统可能有一个限制,要求在偶数地址边界上开始2字节的访问。 如果addr1是奇数,那就违反了。

为什么他们不使用u8 *并比较一个字节一个字节来解决未对齐的问题?

可能假设目标系统不会遇到上述问题。 一次使用一个字节将处理这种情况。


注意:看起来这个功能的两个部分并不等同。 考虑数据位全零,第一个返回true ,第二个返回false