系统调用是什么

简介: 系统调用 1.系统调用和普通函数完全不同,系统调用实际上是0x80号中断对应的中断处理程序的子程序。换句话说,在linux系统上,0x80中断是系统调用的统一入口。某个具体的系统调用是这个中断处理程序的子程序,进入具体某个系统调用是通过内核定义的系统调用号码来实现的。

系统调用

1.系统调用和普通函数完全不同,系统调用实际上是0x80号中断对应的中断处理程序的子程序。换句话说,在linux系统上,0x80中断是系统调用的统一入口。某个具体的系统调用是这个中断处理程序的子程序,进入具体某个系统调用是通过内核定义的系统调用号码来实现的。linux通过执行如下汇编代码陷入内核执行系统调用:
int 0x80; //这一句是进入系统调用统一入口。
2.每个系统调用在内核里面都对应一个号码,这个号码是在/usr/include/i386-linux-gnu/asm/unistd_32.h中定义的。如下图,图1所示
图1 内核定义系统调用号码

在执行"int 0x80;"进行中断之前,应用层会做如下准备工作:
1.把系统调用号码赋值给寄存器EAX;
2.把系统调用需要的参数按次序赋值给寄存器EBX,ECX,EDX等等。
这样,等下0x80中断发生的时候,系统调用需要的全部信息就能通过这些寄存器传递给中断处理程序了。
注:实际上系统调用需要的参数也可以使用应用程序的栈传入内核。稍后实验环节可以看到,这个不用太纠结。


系统调用执行流程

如下图图2:
图2 系统调用执行流程

系统调用举例

原型:
ssize_t write(int fd, const void *buf, size_t count);
例子:
write(1,"abc\n",5); //往屏幕上打印"abc\n"。注意,buf里面是5个字符,第5个是字符串结尾0
1.根据/usr/include/i386-linux-gnu/asm/unistd_32.h的宏定义,我们可以得出write()在linux上的系统调用号是4;
2.write()需要3个参数;
3.在应用层,把系统调用号4赋给EAX。
movl $4, (%eax);
4.在应用层,把fd(1是屏幕输出)赋给EBX。
movl $1, %ebx;
5.在应用层,把buf首地址赋给ECX。
movl $.LC0, %ecx (下面实验环节可看到$.LC0对应buf首地址);
6.在应用层,把buf携带的有效数据长度赋给EDX。
movl $5, %edx;
7.陷入内核,进入系统调用统一入口。
int $0x80;
8.内核执行write()系统调用;
9.系统调用返回。


系统调用实验

1.原始C程序
图3 write.c
C程序执行结果,如图4
图4

2.使用gcc将C程序编译为汇编

gcc -S write.c
会生成write.s,汇编内容如图5
图5 write.s


直接编译write.s,生成a.out,并执行。如图6
图6

3. 现在我们自己写一个 汇编mywrite.s,执行write系统调用。
汇编内容如图7
图7 mywrite.s

mywrite.s编译后执行结果,如图8
图8
现在,我们成功使用int 0x80进行了系统调用。
目录
相关文章
|
3月前
|
C++
什么是单项式
单项式是代数式中的一种
|
7月前
|
存储 监控 文件存储
《告别磁盘空间焦虑!LVM的灵活分配与扩展秘籍》
逻辑卷管理(LVM)是磁盘空间管理的强大工具,突破了传统分区固定大小的限制。它通过物理卷(PV)、卷组(VG)和逻辑卷(LV)三层结构,实现存储空间的灵活分配与动态扩展。LVM适用于企业服务器、虚拟化环境及大数据集群等场景,能高效应对不断变化的存储需求。使用时需注意数据备份、合理规划与状态监控,确保系统稳定运行。掌握LVM原理与操作,可显著提升磁盘空间管理效率。
234 26
陌陌无限注册一键新机,陌陌无限注册活号技术,主要就是看这个插件技术
本项目基于Xposed框架实现陌陌APP的设备信息伪装,避免多账号注册被封号。通过主Hook类、机型伪装逻辑、系统属性拦截器和Xposed入口文件
|
10月前
|
Python
灵码回复消息的字体太小,并在pycharm中没法设置.Baidu Comate就可以直接插件中设置了
在使用灵码回复消息时,字体过小且在PyCharm中无法调整。而Baidu Comate插件则可以在插件设置中直接修改字体大小,提供更好的阅读体验。
605 78
|
8月前
|
监控 Java 编译器
聊聊JVM如何优化
JVM的优化是一个复杂而细致的过程,涉及内存管理、垃圾回收、即时编译、线程调度等多个方面。通过合理配置JVM参数、选择合适的垃圾回收器、优化线程调度和使用专业的监控工具,可以大幅提升Java应用的性能和稳定性。掌握这些优化技巧,能够帮助开发者在高并发、高负载的生产环境中保持系统的高效运行。
403 13
|
8月前
|
算法 NoSQL Java
场景题:10亿QQ用户,如何统计在线人数?
在竞争激烈的就业市场中,面试不仅考察八股文、算法和项目经验,场景题也愈发重要。本文介绍Java面试中的“在线人数统计”问题:面对亿级用户,如何高效统计在线人数。传统数据库方案难以应对频繁的上线下线操作带来的IO压力,而使用Bitmap(位数组)或Redis的Bitmap命令则能有效解决这一问题。通过将每个用户的在线状态映射到位数组中,仅需119.2MB内存即可处理10亿用户,在线人数统计变得简单高效。
320 9
|
9月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
260 1
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
|
8月前
|
机器学习/深度学习 人工智能 DataWorks
《数据驱动新变革:DataWorks与图神经网络打造AI决策“最强大脑”》
在数字化时代,数据成为企业的核心资产。DataWorks作为大数据管理的中流砥柱,负责存储、整合和治理海量数据;图神经网络(GNN)则为处理复杂图结构数据提供创新方案。两者结合,开启了知识图谱数据处理与分析的新纪元,助力人工智能推理与决策。DataWorks构建庞大的数据生态体系,涵盖结构化、半结构化及非结构化数据。知识图谱如同智能导航灯塔,将分散的数据编织成紧密的知识网络。以互联网广告行业为例,DataWorks收集用户浏览、广告投放等数据,通过知识图谱关联,揭示用户与广告主、创意间的复杂关系。
203 5
|
9月前
|
JSON API 开发者
小红书商品详情API接口(小红书API系列)
小红书商品详情API接口帮助开发者获取平台上特定商品的详细信息,包括标题、价格、图片、描述、评价数量等。支持HTTP GET/POST请求,返回JSON格式数据。通过传递商品ID及其他可选参数,开发者可以将小红书的商品信息整合到自己的应用中,提供更丰富的购物体验。Python示例代码展示了如何使用requests库发送GET请求并处理响应数据。实际使用需替换为真实接口地址和商品ID,并遵循平台认证要求。
|
9月前
|
传感器 人工智能 Java
你知道数字电路的基础逻辑门电路吗,来拿下
基础逻辑门电路是数字电路的核心单元,包括与门、或门、非门、与非门、或非门、异或门和同或门。每种门电路执行特定的逻辑运算,产生相应的输出信号。例如,与门仅在所有输入为高电平时输出高电平;或门只要有一个输入为高电平就输出高电平;非门则对输入信号取反。这些门电路广泛应用于计算机CPU、报警系统、数据校验和同步电路中,是构建复杂数字系统的基石。
1047 0
你知道数字电路的基础逻辑门电路吗,来拿下