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

相关推荐
MIXLLRED几秒前
解决:RealSense D435 在树莓派4B(Ubuntu 22.04 + ROS2 Humble)上的权限与驱动问题完整复盘
linux·ubuntu·树莓派·realsense d400
白毛大侠4 分钟前
LVS 完全入门:从零理解 Linux 虚拟服务器的三种模式
linux·服务器·lvs
ulias2126 分钟前
Linux中的开发工具
linux·运维·服务器·开发语言·c++·windows
wanhengidc9 分钟前
服务器如何防范爬虫攻击?
运维·服务器·网络·爬虫·游戏·智能手机
qq_2546177710 分钟前
windows脚本.bat实现:自动化远程登录or推文件到板子
linux·自动化
姜太小白14 分钟前
【Linux】CentOS 7 VNC 远程桌面配置
linux·python·centos
mobai718 分钟前
使用pyang将yang模型转换为xml
xml·运维·服务器
qq_4663024521 分钟前
u盘插入拔出,listView不显示盘符变化
c++·qt
捞的不谈~21 分钟前
解决在Ubuntu系统下使用Lucid 相机(HTR003S-001)-Ubuntu 20.04系统遇到GLIBC和GLIBCXX版本不兼容的问题
linux·运维·ubuntu
悠然南风28 分钟前
【云原生学习】Linux网络知识操作精讲 + 实战踩坑
linux