in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,
函数实现:
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。
local_irq_disable() , local_irq_enable() , local_irq_save() 和 local_irq_restore() 为中断处理函数,主要是在要进入临界区时禁止中断和在出临界区时使能中断。local_irq_disable() 和 local_irq_enable() 配对使用;而 local_irq_save() 则和 local_irq_restore() 配对使用。
local_irq_disable() 和 local_irq_save() 都可以禁止中断,但不同的是后者可以保存中断状态。
local_irq_restore() 在使能中断的同时还恢复了由 local_irq_save() 所保存的中断状态。
这 4 个宏定义在 include/linux/Irqflag.h 中:
#define local_irq_enable() \
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
#define local_irq_disable() \
do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
#define local_irq_save(flags) \
do { raw_local_irq_save(flags); trace_hardirqs_off(); } while (0)
#define local_irq_restore(flags) \
do { \
if (raw_irqs_disabled_flags(flags)) { \
raw_local_irq_restore(flags); \
trace_hardirqs_off(); \
} else { \
trace_hardirqs_on(); \
raw_local_irq_restore(flags); \
} \
} while (0)
其中,raw_local_irq_disable() 在 include/asm-i386/Irqflag.h定义为:
1
|
static inline void raw_local_irq_disable(void){ native_irq_disable(); }
|
从 native_irq_disable() 的名字可以看到是”禁止本地中断“ 。禁止本地中断并不保护运行在另一个CPU上的中断处理程序对该数据结构的并发访问。native_irq_disable() 同样定义在 include/asm-i386/Irqflag.h 中:
1
|
static inline void native_irq_disable(void){ asm volatile("cli": : :"memory");}
|
指令 cli 会清除 eflags 控制寄存器中的IF标志,这样就禁止了中断。
同样可以看到 local_irq_enable() 的最终定义为:
1
|
static inline void native_irq_enable(void){ asm volatile("sti": : :"memory");}
|
指令 cli 会设置 eflags 控制寄存器中的IF标志,这样就使能了中断。
有时候,为了避免中断处理程序对 eflags 寄存器内容的破坏,在进入临界区时使用 local_irq_save() 来保存 eflags 寄存器(将 elfags 保存在一个变量中)以及在出临界区时用 local_irq_restore() 来恢复 eflags 寄存器。同样在 include/asm-i386/Irqflag.h 有定义:
对应于 local_irq_save() 有:
1
|
static inline unsigned long native_save_fl(void){ unsigned long f; asm volatile("pushfl ; popl %0":"=g" (f): /* no input */); return f;}
|
上面,先将 eflags 压入栈中,然后再弹出到 f 变量中将其保存起来。
对应于 local_irq_restore() 有:
1
|
static inline void native_restore_fl(unsigned long f){ asm volatile("pushl %0 ; popfl": /* no output */ :"g" (f) :"memory", "cc");}
|
上面,将变量 f 压入栈,然后弹到 eflags 中。另外,cc 是因为汇编指令会修改 eflags 寄存器时而采用。
对于单 CPU,非抢占的情况,假如有:
local_irq_disable()
/* 临界区代码 */
local_irq_enable()
这里,如果当执行到 local_irq_disable() 时,中断已经被禁止。那么在退出临界区时,再执行 local_irq_enable() 时会使所有的中断都打开,这样是可能带来副作用的,修正这种情况的办法是使用 local_irq_save() 和 local_irq_restore()。
本课程主要介绍了Node.js中console对象方法的使用、常用命令以及如何调试Node.js脚本。
Excel图表工具——添加数据标签比JWalk Chart Tools使用更简单的一种小工具——DataLbale来自ExcelHome的大神,链接http://club.excelhome.net/thread-256051-1-2.html安装1.解压压缩文件(下载路径自定义)2.使用Excel打开DtatLable.xls(若出现安全声明,则选择:启用宏)3.在工作表菜单栏出现加载项——更改数据标签优点1.安装使用简单2.加载项——更改数据标签将一直位于菜单栏,不会_添加数据标签
在ubuntu 16的版本中,安装了mysql 后,启动时,程序提示 Starting MySQL database server mysqld No directory, logging in with HOME=的错误。解决办法:Stop MYSQL service:sudo service mysql stopChange home directory of mysql from n...
要制作一个在线聊天的程序,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息。聊天程序是基于AJAX设计的,没有用框架,消息容器是一个DIV,所以问题就在于如何控制DIV的滚动条。但同样的代码拿到我这里却完全失效,又仔细查了下资料说XHTML标准下scrollTop的值恒为0,解决办法是使用 document.documentElement.scrollTop代替document..._python scrollbar滚动到末端
1、修改 iso 镜像一般刚安装完linux虚拟机时,这个路径指向的是iso系统安装文件,比如CentOS-7-x86_64-DVD-1804.iso,我的路径是E:\ContOS\iso\CentOS-7-x86_64-DVD-1804.iso ,应该修改成VMware15 软件安装路径下的Linux.iso镜像,我的路径是C:\software\vmware15\linux.iso2、开机 -> 双击VMware Tools3、安装VMware Tools[root@hadoop101_vm15.5 tools
gnu binutils 想象一下,虽然无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且可以更好地修复错误。 所有这些都是二进制形式。 听起来像是拥有超级大国,不是吗? 您也可以拥有这样的超级能力,GNU二进制实用程序(binutils)是一个很好的起点。 GNU binutils是二进制工具的集合,这些工具默认情况下安装在所有Linux发行版中。 二进制分析是计..._gnu bi'nu'ti'l's
除了数组以外,栈【Stacks】和队列【Queues】就是和数组有些类似,但是拥有更多形式来添加和删除元素的数据结构,这篇来讨论栈。栈是一个遵循后进先出【Last In First Out】的有序集合,最先进栈的元素叫做base,最后进的元素叫做top。生活中栈的例子比如说公寓楼里的电梯,最后进去的人最先出来。在计算机中比如浏览器的前进和后退功能的实现,以及在Chrome浏览器Devtool工具查..._判断一个字符串是否中心对称,利用栈实现
迅为i.MX8Mmini开发板Ubuntu-base构建-解压Ubuntu-base_i.mx 8 ubuntu
使用docker容器部署NFS,exportfs:不支持NFS导出,在使用docker特权模式进入容器后,依然提示not support NFS export,判断为目录文件问题,将宿主机上目录挂载至容器中,执行命令不提示错误。使用特权模式进入容器,执行exportfs -a时提示/data/nfs does not support NFS export[root@docker-1 ~]# docker run -itd --privileged=true --name nfs-server cen._does not support nfs export
https://blog.csdn.net/w1035524412/article/details/82863840
ACL访问控制列表一、访问控制列表的工作原理1.访问控制列表在接口应用的方向二、访问控制列表的处理过程1.ACL工作原理2.ACL两种作用3.ACL种类4.ACL的应用原则一、访问控制列表的工作原理ACL(访问控制表)通过包过滤技术,在路由器上读取OSI七层模型的第三层和第三层包头中的信息。根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的。第三层传输层 —— 数据段——源端口、目的端口—————————————————————— 通信四元组第四层网络层 —— 数据包——源IP、目的IP_acl工作在第几层
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。特点 :可以用一个head 和一个tail 分别指向头和尾的节点每个节点都由三部分组成:前一个节点的指针(prev)/保存元素(item)/后一个节点的指针(next)双向链表的第一个节点的prev是null双向链表的最后节点的next是null常用方法:append(data) 追加元素_js双向链表排序算法