除了函数入口点和返回地址之外,内存中可以有哪种PC地址?

时间:2015-04-04 18:46:33

标签: linux compiler-construction linux-kernel operating-system kernel

程序计数器(PC)值/地址(如x86_64上%RIP中的值)可能由于某些原因而在内存中(不考虑.text段中的直接调用/跳转指令):

  1. 功能指针。
  2. 堆栈中的函数返回地址。
  3. 跳转表(C中的开关/案例,C ++中的方法分派)。
  4. 上下文恢复:setjmp / longjmp,C ++异常处理,ptrace,getcontext,siglongjmp,信号传递/ sigreturn。
  5. 在内核中,

    1. 中断返回地址。
    2. 页面错误处理程序,可重新启动的原子序列(RAS)注册表。
    3. 线程/进程上下文结构,如任务状态段(TSS),task_struct。
    4. 在AMD64 / i386 / ARM上,对于不同的操作系统,存储在内存中的PC地址除了函数入口指针(例如,函数指针)之外还有什么其他可能用途?

      此外,这些地址是否有任何形式的编码?

      例如,在跳转表中,在x86_64上,编译器可以使用32位偏移而不是64位完整地址。在glibc的setjmp / longjmp jmp_buf中,它们对保存的寄存器值使用特殊编码(PTR_MANGLE)。

0 个答案:

没有答案