Linux内核——cli()和sti()——标志寄存器的中断标志

2023-11-06

cli()和sti()有点类似于汇编指令中的CLI和STL,当某个任务在执行的过程中不想被中断,则可以在任务的开始出执行cli(),在任务的结束处执行sti(),恢复中断的执行。

为了避免竞争条件和中断对临界代码区的干扰,在Linux 0.12内核代码中许多地方使用了cli和sti指令。cli指令用来复位CPU标志寄存器中的中断标志,使得系统在执行cli指令后不会响应外部中断。 sti指令用来设置标志寄存器中的中断标志,以允许CPU能识别并响应外部设备发出的中断。当进入可能引起竞争条件的代码区时,内核中就会使用cli指令来关闭对外部中断的响应,而在执行完竞争代码区时内核就会执行sti指令以重新允许CPU响应外部中断。

例如,在修改文件超级块的锁定标志和任务进入/退出等待队列操作时都需要首先使用cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应。如果不使用cli、sti 指令对,即在需要修改一个文件超级块时不使用cli来关闭对外部中断的响应,那么在修改之前判断出该超级块锁定标志没有置位而想设置这个标志时,若此时正好发生系统时钟中断而切换到其他任务去运行,并且碰巧其他任务也需要修改这个超级块,那么此时这个其他任务会先设置超级块的锁定标志并且对超级块进行修改操作。当系统又切换回原来的任务时,此时该任务不再判断锁定标志就继续执行设置超级块的锁定标志,从而造成两个任务对临界代码区的同时操作,引起超级块数据不一致,严重时会导致内核系统崩溃。

http://www.startos.com/zhuanti/zt02/2010/1108/8799.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核——cli()和sti()——标志寄存器的中断标志 的相关文章

  • Linux经典书籍推荐

    Linux经典书籍推荐 入门篇 LINUX权威指南 书不错 写的很全面也比较广 涉及的不深 做为入门书籍不错 可以比较全面的了解linux 另外比较热门的也可以看看 鸟哥的私房菜 等书 偏管理类的书 如果想做server方向的可以找来看看
  • linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间

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

    Version info Linux 3 10 Android 4 2 一 问题 现在有USB设备插入Android系统 那么如何得知插入的设备类型 是USB打印机 U盘 还是USB鼠标 二 USB类型规定 对于USB类型 USB组织是有规
  • chinaUnix中的linux源代码学习

    原文地址 http bbs chinaunix net thread 1930079 1 1 html 大家好 内核源码版对本版块的精华帖进行了分类汇总 所有的精华帖分为十大类 各个分类的精华帖相关信息分布在该贴2 11楼 每个分类各占1楼
  • local_irq_save和 local_irq_disable

    如果你要禁止所有的中断该怎么办 在2 6内核中 可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理 这两个函数定义在
  • 使用Crash工具分析 Linux dump文件

    前言 Linux 内核 以下简称内核 是一个不与特定进程相关的功能集合 内核的代码很难轻易的在调试器中执行和跟踪 开发者认为 内核如果发生了错误 就不应该继续运 行 因此内核发生错误时 它的行为通常被设定为系统崩溃 机器重启 基于动态存储器
  • linux的自旋锁struct spinlock_t的使用

    在linux中提供了一些机制用来避免竞争条件 最简单的一个种就是自旋锁 例如 当一个临界区的数据在多个函数之间被调用时 为了保护数据不被破坏 可以采用spinlock来保护临界区的数据 当然还有一个就是信号量也是可以实现临界区数据的保护的
  • linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码 下载网址 https github com raspberrypi linux 在树莓派使用指令 uname r查看当前树莓派的版本号 然后选择对应的linux内核版本号进行下载 将linux内核源码从共享
  • Linux read的核心函数generic_file_buffered_read

    内核 5 9 0 流程图 generic file buffered read一种调用路径 cat某个文件触发 0 ondemand readahead mapping 0xffff888005c61340 ra 0xffff8880059
  • netpoll浅析

    netpoll只是一种框架和一些接口 只有依赖这个框架和接口实现的netpoll实例 netpoll才能发挥它的功能 类似于kernel中的vfs vfs本身并不会去做具体的文件操作 只是为不同的文件系统提供了一个框架 netpoll不依赖
  • linux支持usb打印机

    配置CONFIG USB PRINTER y inux内核默认运行打印机 核 驱动 直接在配置上CONFIG USB PRINTER y添加上去就好了 make menuconfig 选上USB打印机选项 Device Drivers gt
  • Linux设备模型4 kobj_attribute

    在上文Linux设备模型 3 Kobject 实例中 我们介绍到如何使用default attribute Default attribute使用很方便 但不够灵活 比如上篇文章在Kobject一节中提到的那个例子 name和val这两个a
  • 第三章 套接字相关数据结构--基于Linux3.10

    本章是对socket通信过程中使用到的比较重要的据结构罗列和意义的阐述 在阅读其它层的代码前 先来看几个重要的数据结构 这几个数据结构贯串四层模型 3 1 socket对应的内核结构体 在用户空间使用socket 函数创建一个套接字 对应的
  • kvm内存管理

    qemu kvm 进程很像一个普通的linux程序 它通过通常的malloc和mmap调用来申请内存 如果一个客户系统想使用1G物理内存 qemu kvm将会做一个malloc 1 lt lt 30 调用 在主机上申请1G的虚拟地址 然而
  • linux设备驱动归纳总结(四):3.抢占和上下文切换

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 上一节介绍了进程调度的一些基本概念 并简单介绍了在没有抢占的情况下
  • diagnose-tools 编译报错

    在 Ubuntu 20 04 4 LTS 环境中 编译diagnose tools 执行make deps时报错 checking whether gcc m32 makes executables we can run no config
  • linux设备驱动makefile入门解析

    以下内容仅作参考 能力有限 如有错误还请纠正 对于一个普通的linux设备驱动模块 以下是一个经典的makefile代码 使用下面这个makefile可以 完成大部分驱动的编译 使用时只需要修改一下要编译生成的驱动名称即可 只需修改obj
  • 慢慢欣赏linux pud_offset解析

    typedef struct pudval t pud pud t gt typedef u64 pudval t dir表示L0页表索引的指针 指向PUD页表的基地址 define pud offset dir addr pud t va
  • 多线程(1):互斥锁

    leetcode 1114题 按序打印 给你一个类 public class Foo public void first print first public void second print second public void thi
  • int $0x80系统调用的idea

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

随机推荐

  • PCB大电流承载方法(100~150A)

    笔者对PCB是否能够承载100 150A大电流的问题进行了分析 一起来看一下吧 常见的PCB可以承载150A电流 但是原则上不推荐作为常规或者持续的使用方法 下面主要论述三个方面 1 PCB承载大电流操作方法 2 PCB承载大电流注意事项
  • Linux查看二进制文件

    Linux查看二进制文件 hexdump hd od xxd hexdump hd 可以使用16进制 10进制 8进制 ascii码的形式查看文件 执行 ls al which hd 就会看到hd其实只是hexdump的一个软链接 使用ma
  • linux定时备份postgresql与恢复数据

    备份命令 参考链接 https www jb51 net article 205924 htm 为了避免操作数据库的风险 因此计划每天对postgresql 数据库 进行定时备份 1 服务器地址 备份服务器地址 10 10 10 101 虚
  • FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

    本文介绍了不同源单表 单表同步 不同源多表 单表同步 注 此版本支持火焰图 Flink版本 1 17 1 环境 Linux CentOS 7 0 jdk1 8 基础文件 flink 1 17 1 bin scala 2 12 tgz fli
  • 艾兰·图灵

    艾伦 麦席森 图灵 1912年生于英国伦敦 1954年死于英国的曼彻斯特 他是计算机逻辑的奠基者 许多人工智能的重要方法也源自于这位伟大的科学家 被誉为计算机科学之父 人工智能之父 计算机逻辑的奠基者 提出了 图灵机 和 图灵测试 等重要概
  • Apifox自动生成接口文档

    1 安装 1 1 Apifox安装 官方文档 Apifox API 文档 调试 Mock 测试一体化协作平台 接口文档工具 接口自动化测试工具 接口Mock工具 API文档工具 API Mock工具 API自动化测试工具 1 2 IDEA
  • 结构体对齐计算方式

    目录 法则一 结构体成员的偏移量必须是成员大小的整数倍 数组除外 法则二 结构体大小必须是所有成员大小的整数倍 数组 结构体除外 带数组的结构体大小计算 带结构体的结构体大小计算 带联合体的结构体大小计算 pragma pack 4 向4对
  • Django模板的使用

    模板文件夹在工程目录下 配置路径 测试 视图 路由 模板 测试 查询数据返回显示在模板中 视图 模板 测试
  • AR开发 - 入门笔记

    文章目录 C C 基础 环境编程 C C 进阶 性能优化 图像处理库 OpenCV 图形学和 OpenGL 深度学习推理库 ncnn GUI框架imgui 多视图几何与 SLAM Unity AR 教程 C C 基础 语法 C99 C 03
  • 前、后端登录验证逻辑

    一 前端先进行第一层校验 前端主要做一些格式的校验 比如用户名 密码的输入符不符合规范 是否为空 验证码输入是否正确 一般验证码的校验在前端 如果验证码都不匹配的话 则不需要调用登录接口 直接return 如果后端给的是图片地址 也可以放在
  • C++中双括号初始化问题

    在刷题时用到了一个栈 网上参考了答案无意中发现了这个双大括号初始化的方法 查阅后发现java有这种用法 说其这本质上是匿名内部类加实例化代码块 但这边个跟类有什么关系 嗯 又想到明明之前用到栈的时候并没有初始化 于是再次定义了一个未初始化的
  • 13. 集群安全

    文章目录 K8S安全机制说明 Authentication 认证 HTTPS 证书需要认证的节点 两种类型 安全性说明 证书颁发 Kubeconfig ServiceAccount Secret 与 SA 的关系 Authorization
  • 【AI面试】降低过拟合的方式方法横评探究

    对于一个 训练调参工程师 来说 在训练过程遇到过拟合现象 是常事 当然 如何降低过拟合 也是在面试过程中 经常被面试官问到的问题 没啥可问的 就只能这样问了 以下是我们会常考虑常事使用的解决方法 按照重要程度依次排列 数据增强 Data A
  • [离散数学]命题逻辑P_3:命题符号化及其应用

    离散数学 命题逻辑P 3 命题符号化及其应用 前言 1 命题联结词的总结 命题联结词 命题联结词的真值表 例子 2 命题联结词的优先级 优先级顺序 例子 3 复合命题符号化 例子 4 联结词应用 开关电路 逻辑电路 网页检索 位运算 总结
  • MYSQL:事务

    事务 理解事务 事务操作 案例 事务的特性 事务的隔离级别 事务的隔离级别 操作 在MySQL中的事务 Transaction 是由存储引擎实现的 在MySQL中 只有InnoDB存储引擎才支持事务 事务处理可以用来维护数据库的完整性 保证
  • 大中型企业网项目实战2021-10-07

    1 问答题 大中型企业网项目实战 实验作业 一 安全管理 1 依据图中拓扑 为全网设备定义主机名 关闭域名解析 并在 Console 和VTY 线路下关闭线路超时并开启输出同步 依据图中拓扑在GNS3 IOU中搭建企业网 外链图片转存失败
  • 小程序封装form表单

    小程序封装form表单 在小程序中 表单是开发中最常用的组件之一 表单可以接收用户的输入数据 并提交给服务器进行处理 为了提高表单的复用性和减少代码重复 我们可以考虑对表单进行封装 使得表单可以在不同的页面中进行复用 本文将分享如何在小程序
  • 查看Linux系统信息

    1 登录到linux服务器执行 lsb release a 命令 即可查看所有版本信息 这个命令适用于所有的linux 包括Redhat SuSE Debian等发行版 注意 centos需要安准lsb LSB是一套核心标准 它保证了LIN
  • dubbo源码实践-serialize层的例子

    目录 1 serialize层概述 2 序列化的简单例子 2 1 项目截图 2 2 三个类的源码 2 2 1 ABC是实体类 2 2 2 TestSeriarsWrite把ABC对象序列化到文件中 2 2 3 TestSeriarsRead
  • Linux内核——cli()和sti()——标志寄存器的中断标志

    cli 和sti 有点类似于汇编指令中的CLI和STL 当某个任务在执行的过程中不想被中断 则可以在任务的开始出执行cli 在任务的结束处执行sti 恢复中断的执行 为了避免竞争条件和中断对临界代码区的干扰 在Linux 0 12内核代码中