我正在观看this video关于使用软件调用引导程序,方法是将系统内存开头的地址分配给一个函数指针,然后调用它,用于存储地址的表达式:
sysMemBootJump = (void(*)(void))(*(u32*)0x1fff0004);
“sysMemBootJump”是函数指针。
但我不明白的是,为什么在将它转换为void(*)(void)之前取消引用内存的地址?
因为'真实'入口点存储在该地址。可以把它想象成一个指向函数的指针,通过解除引用你只得到指向函数的指针。
这相当于:
u32 ad = *(u32*)0x1fff0004;
这是一个位于地址0x1fff0004
的单词
然后
sysMemBootJump = (void(*)(void))ad;
所以0x1fff0004
是包含例程地址的单词的地址。
并注意代码是非常不可移植的。来自uintptr_t
的<stdint.h>
是一种更便携的整体式可铸造地址。
您可以像typedef
一样使用here函数签名来编写更易读的代码。