由于 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 0x80syscall)。堆栈布局(这对于将信号发送回用户空间信号处理程序之类的事情很重要)是不同的。虚拟内存管理必须意识到用户空间不能使用 64 位指针。 TLS 使用不同的段寄存器(gs 用于 32 位,fs 用于 64 位)。

大多数情况下,它的不同之处足以让您最终得到完全独立的系统调用入口/导出和调度代码(其中两个接口(interface)在处理参数和调用约定后调用相同的内部函数)。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!