[阅读: 492] 2009-03-15 12:24:33
比如
u32 bios_read_protec;
....
u32 a;
fast_read_memory(32, u32, 1, a)
fast_read_memory 展开后,会是这样一个语句:
a = *((u32 *)((u8 *)&bios_read_protect+1));
任何编译器下 bios_read_protect 的地址都会是4的整数倍,假设是 0x10000
上面的语句就相当于:
a = *((u32 *)(0x10001));
会访问 0x10001, 0x10002, 0x10003, 0x10004 这四个字节的内存,而 0x10004这个字节用来放什么,是链接器觉定的.因为bios_read_protect只占用 0, 1, 2, 3这四个字节.
在x86上这句话不会报错,但逻辑显然有问题.
大多数非x86上,比如arm, 68k, cpu会产生一个地址异常