当前位置: 首页 > news >正文

通过0x80软件中断执行系统调用

参考书《Linux内核模块开发技术指南》

1.Linux的0x80软件中断

在X86的32位系统下,系统调用是通过0x80软件中断实现的。X86的64位操作系统也支持该方式执行系统调用(需要在编译内核时,配置CONFIG_IA32_EMULATION选项)。
执行0x80软件中断的方式是:在执行软件中断前,将系统调用号放入eax寄存器中,参数1到参数6分别放入:ebx、ecx、edx、esi、edi、ebp寄存器。然后调用int $0x80汇编指令执行系统调用,返回值将保存在eax寄存器中。对于使用0x80软件中断,系统调用号及执行函数等信息保存在内核源码的arch/x86/entry/syscalls/syscall_32.tbl文件中。文件arch/x86/entry/syscalls/syscall_32.tbl的内容如下图所示(截取了syscall_32.tbl的一小部分):
在这里插入图片描述
上图的第1列为系统调用号;第2列对应平台信息,i386表示x86平台;第3列为系统调用的名称;第4列是系统调用在内核的执行函数。可以看出:系统调用exit的系统调用号是1,fork的系统调用号是2,read的系统调用号是3…
上图中,一个系统调用可能有两个执行函数。例如:对于open系统调用,其中一个执行函数是sys_open,另一个执行函数是compat_sys_open。分别对应32位操作系统和64位操作系统下执行open系统调用应该使用的函数。

2.0x80软件中断执行示例

下面将实现一个示例程序,使用软件中断0x80执行系统调用write,将字符串“hello”输出到标准输出。源码如下:

int main()
{char *buf = "hello";          //buf保存了将要输出的字符串“hello”asm volatile("mov $4, %%eax;" //将立即数4放入eax,eax保存的是系统调用号"mov $1, %%ebx;"              //将立即数1放入ebx,ebx保存系统调用的第一个参数"mov %0, %%ecx;"              //将buf放入ebx,ecx保存系统调用的第二个参数"mov $5, %%edx;"              //将立即数5放入edx,edx保存系统调用的第三个参数"int $0x80"::"g"(buf));       //执行0x80软件中断进入系统调用return 0;
}

上述源码使用内联汇编执行int $0x80指令(关于内联汇编,见我的文章:一文弄懂GCC内联汇编)。在执行软件中断前,将系统调用号4放入eax寄存器,系统调用号4对应的是write系统调用;将立即数1放入ebx寄存器,ebx保存了write系统调用的第一个参数,即文件描述符,1是标准输出;将参数buf放入ecx寄存器,ecx保存了write系统调用的第二个参数,即字符串“hello”;将立即数5放入edx寄存器,edx保存了write系统调用的第三个参数,即数据长度,“hello”字符串的长度是5字节。
编译、执行上述源码,将打印出“hello”字符串。

http://www.dtcms.com/a/464881.html

相关文章:

  • (数据库学习四)哈希处理
  • Hibernate中StatelessSession和‌普通Session对比
  • 浙江邮电工程建设有限公司网站企业门户网站建站
  • K8S1.28.2安装与部署
  • 业务知识:强制平仓
  • 币安最高多少杠杆 margin
  • wpf之GroupBox
  • 标签_图片(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • Jira:理解jira / 核心功能 / 应用场景 / 优势特点 / 常见的Jira术语
  • 专门找建筑案例的网站深圳展览展示公司排行
  • ACM算法梳理:
  • K8s集群多节点部署(Ubuntu22.04)
  • OpenCV(七):BGR
  • 仍可绕过:新变通方案可实现微软 Win11 装机 OOBE 创建本地账号
  • 深圳网站建设联系电话seo策略是什么
  • VS2026+QT6.9+opencv图像增强(多帧平均降噪)(CLAHE对比度增强)(边缘增强)(图像超分辨率)
  • Java 开发面试题(多线程模块)
  • 17-基于STM32的宠物饲养系统设计与实现
  • Docker镜像构建指南:Dockerfile语法与docker build命令全解析
  • 网页模板网站推荐网站每天更新多少文章
  • 三大数学工具在深度学习中的本质探讨:从空间表示到动态优化
  • 力扣1234. 替换子串得到平衡字符串
  • 数据链路层协议之STP协议
  • 给Windows电脑重命名有啥好处?
  • 网站后期的维护管理淘宝无货源一键铺货软件
  • 网站开发工程师是干嘛的网站开发职位
  • Java 创建 Word 文档:实现高效文档生成
  • C#限制当前单元格的值为指定值时禁止编辑的方法
  • 【gdb/sqlite3移植/mqtt】
  • 2025年渗透测试面试题总结-106(题目+回答)