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

相关推荐
Severus_black35 分钟前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
雪落漂泊2 小时前
Linux进程(五):进程地址空间篇
linux·运维·服务器
敲上瘾2 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
AR-26710-2 小时前
Linux Day32——网络,ROCE-IB与以太网
linux·运维
wdeok3 小时前
Socket编程Tcp
服务器·网络·tcp
旖旎夜光4 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
千舟软件4 小时前
报修系统对接企业微信和钉钉的3种方式_千舟报修云
服务器·钉钉·企业微信
旖旎夜光5 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
apcipot_rain15 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60515 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map