int $0x80系统调用的idea

2023-11-19

1、基础知识

     用户态和内核态

          一般现代CPU都有几种不同的指令执行级别,Linux总共划分为4个指令执行级别:内核运行在0级别上,1,2级别默认不运行,用户程序运行在3级别上。
          在内核指令执行级别上,代码可以执行特权指令,访问任意的物理地址。
          在用户指令执行级别上,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。
          cs寄存器的最低两位表明了当前代码的特权级:CPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器。

         上述判断由硬件完成。

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


2、int $80汇编指令

          I386CPU将用户空间程序限制在0-3G空间,将内核程序限制在3G~4G空间,这样就实现了用户空间和内核空间的隔离;
          程序的执行过程需要访问特定的系统程序以完成相应的功能。而用户程序运行在用户态,不能够访问特定状态下的系统程序。而用户程序又需要执行系统程序,这就促使int $80的产生:
          应用程序通过int 0x80(软中断)指令实现用户空间与内核空间的交互。CPU会把软中断做为陷阱来处理,所以软中断也称为编程异常,其中int 0x80可以用于执行系统调用。

3、int $80的执行功能

     Int $80主要实现对寄存器的压栈:
  1. 保存:SS:esp,CS:EIP,eflag中的内容到进程对应的内核堆栈;
  2. 修改:SS:esp内容改为system_call对应的的内核堆栈的基地址,CS:EIP:内容改为system_call的第一条指令的地址,eflag内容修改为新的标志。

    

          总而言之,int $0x80的就是在系统调用产生时,完成用户态到内核态的切换。由于用户进程在用户态执行和内核态需要对应不用的内核堆栈,所以再进行系统调用时,需要保存用户态最后的esp,eip等状态信息,以便于系统调用结束能够返回到发生系统调用的地址继续用户程序的执行,这就是int $0x80完成的对寄存器内容的保存。

          执行系统调用的时候,先把系统调用号保存到EAX寄存器中,然后执行int $0x80,然后转入system_call系统调用指令开始执行,system_call根据保存到system_call内核堆栈中的系统调用号的值,转为执行相应的系统调用处理函数。
Iret指令指int $0x80的逆过程,弹出int $0x80指令所产生的内容堆栈块的内容到对应的寄存器中,CPU把控制权有内核交给用户程序,执行状态回到用户态,用户程序继续执行。至此,系统调用,系统返回过程结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

int $0x80系统调用的idea 的相关文章

  • Linux异常(中断)处理体系结构

    前言 可以调到总结处先看明白这篇文章要说明的内容 再回到开头看 1 异常 异常 就是可以打断CPU正常运行流程的一些事情 比如 外部中断 未定义的指令 企图修改只读的数据 执行SWI指令 Software Interrupt Instruc
  • linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间

    linux驱动程序一般工作在内核空间 但也可以工作在用户空间 下面我们将详细解析 什么是内核空间 什么是用户空间 以及如何判断他们 Linux简化了分段机制 使得虚拟地址与线性地址总是一致 因此 Linux的虚拟地址空间也为0 4G Lin
  • 红黑树学习

    红黑树的是一种特殊的二叉搜索树 有如下性质 性质1 节点是红色或黑色 性质2 根是黑色 性质3 每个叶节点是黑色的 性质4 每个红色节点的两个子节点都是黑色 从每个叶子到根的所有路径上不能有两个连续的红色节点 性质5 从任一节点到其每个叶子
  • udev使用笔记

    一 什么是udev udev是linux kernel的设备管理器 在最新的内核版本中kernel 3 10中udev已经代替了以前devfs hotplug等功能 意味着它要处理添加 删除硬件时 所有的用户空间行为 实际上为什么我关注这个
  • Linux操作系统进程的状态和转换(五态模型)

    1 进程的状态和装换 1 1进程的三态模型 按进程在执行过程中的不同情况至少要定义三种状态 运行 running 态 进程占有处理器正在运行的状态 进程已获得CPU 其程序正在执行 在单处理机系统中 只有一个进程处于执行状态 在多处理机系统
  • PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

    相对于linux来说 udev还是一个新事物 然而 尽管它03年才出现 尽管它很低调 J 但它无疑已经成为linux下不可或缺的组件了 udev是什么 它是如何实现的 最近研究Linux设备管理时 花了一些时间去研究udev的实现 udev
  • linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    在驱动程序里 ioctl 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值 cmd除了可区别数字外 还包含有助于处理的几种相应信息 cmd的大小为 32位 共分 4 个域 bit31 bit30 2位为 区别读写 区
  • KVM内核代码结构

    KVM内核代码结构 因为KVM的源代码已经包含在了Linux的内核树中 因此我们只需直接从www kernel org下载代码即可 内核源码包打开较大 解开后目录结构大概是这个样子 涉及KVM的主要有两个目录 virt和arch x86 k
  • 修改 bootargs 方式增加分区(mtd分区和blkdevparts分区)

    1 Linux内核设置分区的两种方式 1 1 内核代码中写死 在内核的平台代码中写死 然后在初始化NandFlash的时候设置 1 2 uboot通过bootargs传递分区表 1 u boot将分区信息 形如 mtdparts xxx b
  • 一文让你彻底了解Linux内核文件系统

    一 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • UBOOT命令总结(转)

    UBOOT命令总结 转 很好的UBOOT命令总结 我在起步时就是看的这篇东西 熟悉了以后就用 看自带帮助就行 Printenv 打印环境变量 Uboot gt printenvbaudrate 115200ipaddr 192 168 1
  • 为什么linux kernel默认的页面大小是4K,而不是4M或8M?

    相信很多人在看内核内存管理部分的时候 都有这样一个疑问 为什么物理页面的大小选择4K 而不是大一些或者小一些呢 这个问题没有固定的答案 仁者见仁智者见智 每个人的关注点不一样 所以这篇文章不是说给出一个固定的答案 更多的只是一篇讨论性的文章
  • brk和sbrk及内存分配函数相关

    brk和sbrk主要的工作是实现虚拟内存到内存的映射 在GNUC中 内存分配是这样的 每个进程可访问的虚拟内存空间为3G 但在程序编译时 不可能也没必要为程序分配这么大的空间 只分配并不大的数据段空间 程序中动态分配的空间就是从这 一块分配
  • linux内核使用的一些算法和思想(个人总结)

    这里只罗列一些算法 其中有些在我之前的博文中有所涉及 有些没有 后续有时间再详细分析每一个算法 排名不分先后 1 trie算法 linux网络子系统中取代了之前哈希算法的新路由算法 适合有大 超大规模路由项的应用场景 2 CFS compl
  • 第九章 tcp拥塞控制--基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 Linux提供丰富的拥塞控制算法 这些算法包括Vegas Reno HSCTP High Speed TCP Westwood BIC
  • dracut 基本介绍

    dracut 基本介绍 dracut 维基 https dracut wiki kernel org index php Main Page http www 360doc com content 13 0428 09 12139495 2
  • 多线程(1):互斥锁

    leetcode 1114题 按序打印 给你一个类 public class Foo public void first print first public void second print second public void thi
  • Linux内核调度算法 -- CPU时间片如何分配

    内核在微观上 把CPU的运行时间分成许多分 然后安排给各个进程轮流运行 造成宏观上所有的进程仿佛同时在执行 双核CPU 实际上最多只能有两个进程在同时运行 大家在top vmstat命令里看到的正在运行的进程 并不是真的在占有着CPU哈 所
  • Linux内核源码学习(1)

    一 内核简介 1 在安装好的Linux系统中 内核的源代码位于 usr src linux 2的10次方就是1K 1024 16位CPU的地址空间是64K X86结构的80386是32位CPU 段描述结构伪代码 typedef struct
  • linux内核-软中断与Bottom Half

    中断服务一般都是在将中断请求关闭的条件下执行的 以避免嵌套而使控制复杂化 可是 如果关中断的时间持续太长就可能因为CPU不能及时响应其他的中断请求而使中断 请求 丢失 为此 内核允许在将具体的中断服务程序挂入中断请求队列时将SA INTER

随机推荐

  • Python命令行参数定义及注意事项

    在命令行中运行python代码是很常见的 下面介绍如何定义命令后面跟的参数 常规用法 Python代码中主要使用下面几行代码来定义并获取需要在命令行中赋值的参数 import argparse parser argparse Argumen
  • STM32(七)DMA总结库函数串口使用DMA

    系列文章目录 文章目录 系列文章目录 前言 一 配置步骤 二 代码实例 前言 DMA 全称为 Direct Memory Access 即直接存储器访问 DMA 传输方式无需 CPU 直接 控制传输 也没有中断处理方式那样保留现场和恢复现场
  • 百度网盘搜索网站

    目录 小白盘 https www xiaobaipan com 56网盘 https www 56wangpan com 盘搜搜 https www pansoso com 如风搜 http www rufengso net 及搜盘 htt
  • L2-045 堆宝塔PTA

    堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小 按照从大到小的顺序堆起宝塔 但彩虹圈不一定是按照直径的大小顺序抓到的 聪明宝宝采取的策略如下 首先准备两根柱子 一根 A 柱串宝塔 一根 B 柱用于临时叠放 把第 1 块彩虹圈作为第 1 座宝
  • lauyi实现表格内显示文件名称,点击实现下载功能。

    定义监听事件 a class layui btn layui btn warm i class layui icon layui icon export i 导出 a js代码 field fileName title 文件名称 width
  • 数据结构之递归的应用场景迷宫问题

    递归是什么 简单的说 递归就是方法自己调用自己 每次调用的时传入不同的变量 递归有助于开发解决复杂的问题 同时可以使代码变的简洁 递归调用机制 直接上代码 用案例说明 我觉得在学校老师好像讲过很多遍了 但是过一端时间自己又写不出来 打印问题
  • DC/DC:闭环控制的隔离型反激变换电路设计及实验仿真(文章底部含仿真程序获取方式)

    反激变换电路在开关管导通时电源将电能转为磁场能储存在变压器中 当开关管关断时再将磁能转变为电能传送到负载 单端反激变换电路是由升降压 Buck Boost 变换电路派生而来的 电路图如图所示 反激变换电路的原理设计可参考文章 DC DC 单
  • 玩转树莓派 一、为你的树莓派烧录系统镜像

    准备工作 1 一台烧录镜像用的电脑 Windows Mac Linux 2 树莓派 3 显示器 高清连接线 根据不同型号需要不同的接口 4 键盘鼠标 5 Micro SD 读卡器 Micro SD 卡 16 128G 6 网线 不使用wif
  • 利用github.io(githubPages)免费托管个人静态网站/个人博客

    我们的个人博客或者静态网站可以托管到github就能通过github域名访问 git仓库配置 我采用的是自己编写一个html文件 githubPages搭建 首先需要在GitHub上创建Github Pages服务 具体步骤如下图 点击之后
  • 11 个Python教程来炫耀你的高级技能

    如果你可以以 Python 式的方式使用 Python 那么 Python 是一种优雅的语言 但不管你有多资深 真正用 Python 写代码都需要一些时间 本文将向你分享 11 个 Pythonic 技巧 让你的 Python 技能提升到一
  • hexo d时提示错误ssh: Could not resolve hostname e. coding. net: Name or service not known解决方案

    步骤1 命令符ping github com 得出的IP github com添加到 etc hosts hosts文件在C Windows System32 drivers etc目录 如拒绝修改 可右键添加用户完全控制权限
  • vue 项目全局修改element-ui的样式

    引入了element ui 但是和我们自己的样式颜色有很大的不同 官网自定义主题 点击查看 修改例子 在src文件下创建 element var scss 代码如下 color primary yellow 修改按钮primary的颜色 改
  • windows MongoDB安装和配置

    一 MongoDB安装和配置 1 进入官网下载你所需要的安装版本 点击直通官网 Step1 进入官网后 将看到如下界面 点击上方导航栏Products 找到Community Server Step2 选择自己需要的版本 系统和压缩方式 2
  • centos启动停留在started GNOME display manager

    Centos启动卡死进不去界面 停留在started GNOME display manager 在安装Centos7 9系统成功后 需要安装显卡驱动 显卡驱动有一个驱动程序自带这图形化界面 安装该驱动程序后 系统一直处于started G
  • Python连接MySQL数据库

    一 准备模块 python连接SQL数据库首先需要用到 pymysql 模块 这里使用pip install指令来安装步骤如下 1 在安装的python的路径下找到Scripts文件夹并打开 在路径上面写成 cmd 后回车 2 进入这个界面
  • springboot配置自定义数据源(Druid德鲁伊)的步骤。

    今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤 方法一 1 在pom xml配置依赖 注释里面的内容 2 配置自己的数据源设置 我是在yaml文件中配置的 顺便提醒一下 在配置yaml文件的时候缩进问题一
  • 【引用】四元组与旋转矩阵

    引用 四元组与旋转矩阵 2011 09 22 17 13 39 分类 DirectX资料 举报 字号 订阅 下载LOFTER客户端 本文转载自ericyang1231 四元组与旋转矩阵 在3D程序中 通常用quaternion来计算3D物体
  • iOS开发之状态栏statusBar颜色变化

    在网上搜索了很久 我也试了很多种情况 下面我为每种情况排布一下优先级 刚开始的时候我没有写播放器 使用的是腾讯的SDK 发现我之前设置的状态栏变化不在发生变化啦 所以在这里做一个小结 Xcode默认的颜色是黑色 记录优化代码的点滴 第一种
  • C++---背包模型---装箱问题(每日一道算法2023.3.9)

    注意事项 本题是 动态规划 01背包 的扩展题 dp和优化思路不多赘述 题目 有一个箱子容量为 V 同时有 n 个物品 每个物品有一个体积 正整数 要求 n 个物品中 任取若干个装入箱内 使箱子的剩余空间为最小 输入格式 第一行是一个整数
  • int $0x80系统调用的idea

    1 基础知识 用户态和内核态 一般现代CPU都有几种不同的指令执行级别 Linux总共划分为4个指令执行级别 内核运行在0级别上 1 2级别默认不运行 用户程序运行在3级别上 在内核指令执行级别上 代码可以执行特权指令 访问任意的物理地址