c语言int 0x80,「JarvisOJ」系统调用——int $0x80/syscall[回顾JOJ level4——无.so]

本文介绍了Linux系统调用的原理,特别是int $0x80汇编指令在老式Linux内核中的作用,它用于用户态到内核态的切换,实现用户程序与内核空间的交互。系统调用参数通过寄存器传递,功能号存储在eax,其他参数依次放在ebx, ecx, edx, esi, edi中。此外,文章还提到了超过5个参数时的传递规则和sysenter指令作为另一种系统调用方式。" 107525955,7728713,数据读取与分析:新闻文本特征探索,"['数据分析', '机器学习', '数据挖掘', 'python', '文本处理']
摘要由CSDN通过智能技术生成

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

宏观上说,int $0x80是intel汇编层面的系统调用,而syscall也是系统调用,只不过是linux系统中c语言环境下的系统调用实体。

只是层面不同,指的是一个东西。

Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用都从用户空间中汇聚到 0x80 中断点,同时保存具体的系统调用号。当 0x80 中断处理程序运行时,将根据系统调用号对不同的系统调用分别处理(调用不同的内核函数处理)。

引起系统调用的两种途径

(1)int $0×80 , 老式linux内核版本中引起系统调用的唯一方式

(2)sysenter汇编指令

一、系统调用

1、基础知识用户态和内核态

一般现代CPU都有几种不同的指令执行级别,Linux总共划分为4个指令执行级别:内核运行在0级别上,1,2级别默认不运行,用户程序运行在3级别上。

在内核指令执行级别上,代码可以执行特权指令,访问任意的物理地址。

在用户指令执行级别上,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。 cs寄存器的最低两位表明了当前代码的特权级:

CPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器。

上述判断由硬件完成。

d715024738dec21396bfefc431c3b354.png

一般来说在Linux中,地址空间是一个显著的标志:0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff的地址空间在两种状态下都可以访问。

2、int $80汇编指令I386CPU将用户空间程序限制在0-3G空间,将内核程序限制在3G~4G空间,这样就实现了用户空间和内核空间的隔离;

程序的执行过程需要访问特定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值