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