Linux 64位系统下32位进程调用系统API的实现方式探讨
x86_64架构下Linux的系统调用机制差异
64位进程的系统调用流程
x86_64架构的Linux 64位系统中,用户态和内核态的代码段、数据段一共使用4个段描述符。
64位进程调用系统API时,会在ring 3(用户态)代码段执行syscall指令进入内核态;内核处理完成后,通过sysret指令将控制权返回给进程,同时把CS段选择器切换回指向64位用户态代码段。
32位进程的系统调用方式
根据Intel SDM文档,syscall指令在IA-32e兼容模式下不受支持,因此Linux下32位进程采用传统的int 0x80中断指令触发系统调用:
- 执行
int 0x80会从ring 3切换到ring 0,内核处理完请求后通过iret指令返回用户态,同时恢复对应的段选择器与栈环境。 - 这和Windows 64位系统的实现不同:Windows通过Wow64子系统支持32位应用,调用系统API时会先在用户态将CPU从32位兼容模式切换到64位模式,实际以64位模式调用系统API,返回后再切回兼容模式。
内容的提问来源于stack exchange,提问作者CarloC
相关产品推荐
相关产品推荐

