浅谈Linux中一次系统调用的执行过程

本文以 X86体系架构,Linux操作系统 来叙述。

我们以open()系统调用来说,这里我们要明白一点 open() 是glibc封装之后的系统调用。

cpp 复制代码
// glibc 源码 (sysdeps/unix/sysv/linux/open.c)
int open(const char *file, int oflag, ...) {
    return INLINE_SYSCALL(open, 3, file, oflag, ...);
}

当用户程序中调用了 open( ... ),编译器在预处理阶段会将open( ... ) 当作宏替换,产生一些代码,这些代码包括:将open() 系统调用的系统调用号,存储在eax寄存器中。

当真正执行到 open( ... ) 的时候,首先将open() 系统调用的系统调用号,存储在eax寄存器中,之后执行 int 0x80。

复制代码
mov eax, 5       ; __NR_open
mov ebx, path    ; 参数1: 文件路径指针
mov ecx, flags   ; 参数2: 打开标志
mov edx, 0666o   ; 参数3: 文件模式 (可省略)
int 0x80

让CPU去查中断向量表的0x80号中断服务函数,发现是系统调用入口函数,entry_INT80_32,保存当前用户寄存器信息,再读取eax中的系统调用函数的函数号,查系统调用函数的系统调用函数表,发现是open系统调用,之后执行sys_open(),参数通过ebx,ecx,edx传递,将执行玩的结果存放在eax中,恢复用户寄存器,执行iret返回用户态。

相关推荐
寻星探路几秒前
网络原理全景图:从通信起源到 TCP/IP 体系架构深度拆解
java·网络·c++·python·tcp/ip·http·架构
天码-行空4 分钟前
【大数据环境安装指南】ZooKeeper搭建spark高可用集群教程
大数据·linux·运维·zookeeper·spark
无垠的广袤8 分钟前
【上海晶珩睿莓 1 单板计算机】物联网环境监测终端
linux·python·嵌入式硬件·物联网·mqtt·home assistant
Dovis(誓平步青云)9 分钟前
《拆解Linux中的IP协议与数据链路层:地址、路由与分片的底层逻辑》
linux·网络·tcp/ip
爪哇部落算法小助手9 分钟前
每日两题day67
c++·算法
qq_4474294110 分钟前
Gemini CLI 非交互模式工具调用机制详解
linux·运维·服务器
你撅嘴真丑13 分钟前
短信计费 和 甲流病人初筛
数据结构·c++·算法
代码游侠16 分钟前
复习——SQLite3 数据库
linux·服务器·数据库·笔记·网络协议·sqlite
阿猿收手吧!18 分钟前
【音视频】MP4 文件结构详细解析
c++·音视频
chenyuhao20242 小时前
Linux网络编程:传输层协议UDP
linux·服务器·网络·后端·udp