由于x86-64 CPU可以直接运行x86-32代码,并且写入eax
会将rax
的高位清零,因此系统调用编号将是正确的。内核还需要做什么工作来运行x86-32程序?
答案 0 :(得分:2)
内核还需要做什么工作才能运行x86-32程序?
需要拆分所有64位参数(例如,在edx:eax
而不是rax
中传递)。用于调用内核API的机制完全不同(int 0x80
与syscall
)。堆栈布局(对于将信号发送回用户空间信号处理程序等问题很重要)是不同的。虚拟内存管理必须意识到用户空间不能使用64位指针。不同的段寄存器用于TLS(gs
表示32位,fs
表示64位。
大多数情况下,你最终会得到完全独立的系统调用入口/出口和调度代码(其中两个接口在处理参数和调用约定后调用相同的内部函数)。