如何访问位于机器位置0的中断向量?

时间:2010-07-27 21:15:05

标签: c

如何访问位于机器位置0的中断向量?如果我将指针设置为0,编译器可能会将其转换为某个非零内部空指针值。

3 个答案:

答案 0 :(得分:2)

你是正确的,根据你的C实现,内部空指针可能不是0.但通常是。如果您想要非常安全,可以对值进行类型转换,或使用memset()

uintptr_t zerobits = 0;
void *pointer1 = (void *)zerobits;

或:

void *pointer2;
memset(&pointer2, 0, sizeof pointer2);

答案 1 :(得分:2)

如果您正在一个需要在地址零处读取/写入向量的域中工作(我猜你是在某种嵌入式系统上?),那么你会发现很多你正在做的事情将是除了'C'标准的一般直接中下解释之外。

您可以非常安全地假设嵌入式编译器将生成对您放入指针的地址的访问,而不会神奇地更改其内容。

但是,您不能总是假设数据表中的物理地址零是读取/写入地址零时处理器访问的内容。如果处理器中有MMU,那么您可能需要通过逻辑 - >某种物理映射过程,即使没有完整的MMU,许多现代小型嵌入式处理器也会使用中断向量周围的地址空间来玩游戏(从闪存中启动,然后可选地将该部分地址空间重新映射到RAM,例如。)

答案 2 :(得分:1)

因为位置0处的任何东西显然都取决于机器,所以你可以自由地使用任何与机器相关的技巧来实现。阅读供应商的文档。如果您访问位置0对您来说很有意义,系统将会设置为相当容易。一些可能性是:

只需将指针设置为0.(这是不必工作的方式,但如果它有意义,它可能会。) 将整数0分配给int变量,并将该int转换为指针。 (这也不能保证有效,但可能会有效。) 使用union将指针变量的位设置为0:

union {
    int u_p;
    int u_i;    / assumes sizeof(int) >= sizeof(int *) */
} p;

p.u_i = 0;

使用memset将指针变量的位设置为0:

memset((void *)&p, 0, sizeof(p));

声明外部变量或数组

extern int location0;

并使用汇编语言文件或一些特殊的链接器调用来安排此符号引用(即变量放在)地址0。