浅谈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返回用户态。

相关推荐
田里的水稻5 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
2301_794333915 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
Jayden_Ruan6 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
荣光波比6 小时前
Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
linux·运维·服务器·nginx·云计算
liulun6 小时前
Skia如何渲染 Lottie 动画
c++·动画
武文斌777 小时前
单片机:DS18B20测温度、74HC595扩展芯片、8*8LED矩阵
运维·服务器·单片机·嵌入式硬件
点云SLAM7 小时前
C++ 常见面试题汇总
java·开发语言·c++·算法·面试·内存管理
阿sir1988 小时前
ZYNQ 自定义IP
服务器·网络·tcp/ip
绿箭柠檬茶9 小时前
Ubuntu 使用 Samba 共享文件夹
linux·运维·ubuntu
UnnamedOrange9 小时前
ROS2 配置 linter 的代码格式化工具为 clang-format
c++·cmake