由于 x86-64 CPU 可以直接运行 x86-32 代码,写入 eax
会将 rax
的高位清零,因此系统调用号将是正确的.要运行 x86-32 程序,内核还需要做哪些其他工作?
请您参考如下方法:
What other job does the kernel have to do to run x86-32 program?
所有 64 位参数都需要拆分(例如,传入 edx:eax
而不仅仅是 rax
)。用于调用内核 API 的机制完全不同(int 0x80
与 syscall
)。堆栈布局(这对于将信号发送回用户空间信号处理程序之类的事情很重要)是不同的。虚拟内存管理必须意识到用户空间不能使用 64 位指针。 TLS 使用不同的段寄存器(gs
用于 32 位,fs
用于 64 位)。
大多数情况下,它的不同之处足以让您最终得到完全独立的系统调用入口/导出和调度代码(其中两个接口(interface)在处理参数和调用约定后调用相同的内部函数)。