位置: IT常识 - 正文

linux中断的上半部和下半部详解(linux中断原理)

编辑:rootadmin
与Linux中断息息相关的一个重要概念是Linux中断分为两个半部:上半部(tophalf)和下半部(bottom half)。今天小编将为大家带来的是linux中断的上半部和下半部详解!希望对大家会有帮... 17-03-21

推荐整理分享linux中断的上半部和下半部详解(linux中断原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux中断系统,linux中断处理流程,linux中断类型,linux中断系统,linux中断系统,linux中断处理流程,linux中断系统,linux中断的概念,内容如对您有帮助,希望把文章链接给更多的朋友!

与Linux中断息息相关的一个重要概念是Linux中断分为两个半部:上半部(tophalf)和下半部(bottom half)。上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。因此,上半部执行的速度就会很快,可以服务更多的中断请求。但是,仅有"登记中断"是远远不够的,因为中断的事件可能很复杂。因此,Linux引入了一个下半部,来完成中断事件的绝大多数使命。下半部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的,下半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断!下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

Linux实现下半部的机制主要有tasklet和工作队列。

Tasklet基于Linux softirq,其使用相当简单,我们只需要定义tasklet及其处理函数并将二者关联:

void my_tasklet_func(unsigned long); //定义一个处理函数:DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); //定义一个tasklet结构my_tasklet,与my_tasklet_func(data)函数相关联

然后,在需要调度tasklet的时候引用一个简单的API就能使系统在适当的时候进行调度运行:

tasklet_schedule(&my_tasklet);

此外,Linux还提供了另外一些其它的控制tasklet调度与运行的API:

DECLARE_TASKLET_DISABLED(name,function,data); //与DECLARE_TASKLET类似,但等待tasklet被使能tasklet_enable(struct tasklet_struct *); //使能tasklet tasklet_disble(struct tasklet_struct *); //禁用tasklet tasklet_init(struct tasklet_struct *,void (*func)(unsigned long),unsigned long); //类似DECLARE_TASKLET() tasklet_kill(struct tasklet_struct *); // 清除指定tasklet的可调度位,即不允许调度该tasklet

我们先来看一个tasklet的运行实例,这个实例没有任何实际意义,仅仅为了演示。它的功能是:在globalvar被写入一次后,就调度一个tasklet,函数中输出"tasklet is executing":

#include … //定义与绑定tasklet函数void test_tasklet_action(unsigned long t);DECLARE_TASKLET(test_tasklet, test_tasklet_action, 0);void test_tasklet_action(unsigned long t){printk("tasklet is executing\n");}…ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off){…if (copy_from_user(&global_var, buf, sizeof(int))){return-EFAULT;}//调度tasklet执行tasklet_schedule(&test_tasklet);return sizeof(int);}

下半部分的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。在Linux2.6的内核中存在三种不同形式的下半部实现机制:软中断,tasklet和工作队列。

下面将比较三种机制的差别与联系。

软中断:

1、软中断是在编译期间静态分配的。

linux中断的上半部和下半部详解(linux中断原理)

2、最多可以有32个软中断。

3、软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序。

4、可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),

因此也需要使用自旋锁来保护其数据结构。

5、目前只有两个子系直接使用软中断:网络和SCSI。

6、执行时间有:从硬件中断代码返回时、在ksoftirqd内核线程中和某些显示检查并执行软中断的代码中。

tasklet:

1、tasklet是使用两类软中断实现的:HI_SOFTIRQ和TASKLET_SOFTIRQ。

2、可以动态增加减少,没有数量限制。

3、同一类tasklet不能并发执行。

4、不同类型可以并发执行。

5、大部分情况使用tasklet。

工作队列:

1、由内核线程去执行,换句话说总在进程上下文执行。

2、可以睡眠,阻塞。

本文链接地址:https://www.jiuchutong.com/zhishi/283127.html 转载请保留说明!

上一篇:win10商店错误代码0x80D02017怎么办(win10商店发生了错误请稍后再试)

下一篇:mc.exe - mc是什么进程文件 有什么作用(mcshield.exe是什么进程)

  • 苹果12如何设置来电铃声(苹果12如何设置壁纸)

    苹果12如何设置来电铃声(苹果12如何设置壁纸)

  • 新版qq的qq看点在哪里(qq看点新功能)

    新版qq的qq看点在哪里(qq看点新功能)

  • 拼多多商品备注哪里写(拼多多商品备注可以备注什么)

    拼多多商品备注哪里写(拼多多商品备注可以备注什么)

  • 红米k30pro屏幕刷新率是60hz吗(红米k30pro刷屏多少)

    红米k30pro屏幕刷新率是60hz吗(红米k30pro刷屏多少)

  • 微信横屏怎么关闭(苹果手机微信横屏怎么设置)

    微信横屏怎么关闭(苹果手机微信横屏怎么设置)

  • 手机解不开密码怎么办(手机解不开密码了怎么办vivo手机保密密码也忘了视频)

    手机解不开密码怎么办(手机解不开密码了怎么办vivo手机保密密码也忘了视频)

  • 十代酷睿和八代酷睿区别(十代酷睿比八代酷睿强多少)

    十代酷睿和八代酷睿区别(十代酷睿比八代酷睿强多少)

  • 苹果X手机电池怎么显示(苹果x手机电池发烫怎么个回事)

    苹果X手机电池怎么显示(苹果x手机电池发烫怎么个回事)

  • 微信怎么开扩音模式(如何开启微信语音功能)

    微信怎么开扩音模式(如何开启微信语音功能)

  • 抖音拍照片怎么保存到相册(抖音拍照片怎么不保存到相册)

    抖音拍照片怎么保存到相册(抖音拍照片怎么不保存到相册)

  • 苹果10w充电头可以充手机吗(苹果10w充电头可以给华为充电吗)

    苹果10w充电头可以充手机吗(苹果10w充电头可以给华为充电吗)

  • tdscdma是哪个运营商(tdscdma wcdma)

    tdscdma是哪个运营商(tdscdma wcdma)

  • 为什么苹果手机不显示时间和电量(为什么苹果手机会发烫)

    为什么苹果手机不显示时间和电量(为什么苹果手机会发烫)

  • mde40是啥型号(md40a)

    mde40是啥型号(md40a)

  • 淘宝预售定金怎么退款(淘宝预售定金怎么设置)

    淘宝预售定金怎么退款(淘宝预售定金怎么设置)

  • 饿了么账户异常怎么解除(饿了么账户异常多久能恢复)

    饿了么账户异常怎么解除(饿了么账户异常多久能恢复)

  • 苹果11nfc功能怎么开启(苹果11nfc功能怎么读卡)

    苹果11nfc功能怎么开启(苹果11nfc功能怎么读卡)

  • uc浏览器私密相册在哪(请问uc浏览器的隐私相册在哪里?)

    uc浏览器私密相册在哪(请问uc浏览器的隐私相册在哪里?)

  • xsmax前面的灯怎么亮(苹果xsmax前面那个灯怎么不亮)

    xsmax前面的灯怎么亮(苹果xsmax前面那个灯怎么不亮)

  • 淘宝神笔在哪里(淘宝神笔模板哪里购买)

    淘宝神笔在哪里(淘宝神笔模板哪里购买)

  • 云盘是储存在什么地方(储存在云盘的文件安全吗)

    云盘是储存在什么地方(储存在云盘的文件安全吗)

  • 考虫的课如何永久保存(考虫课怎么永久保留?)

    考虫的课如何永久保存(考虫课怎么永久保留?)

  • type-c数据线通用吗(type c数据线都一样吗)

    type-c数据线通用吗(type c数据线都一样吗)

  • Windows 10如何设置默认照片查看器(windows10如何设置输入法)

    Windows 10如何设置默认照片查看器(windows10如何设置输入法)

  • phpcms v9判断用户是否登录(php判断数据库用户名是否存在)

    phpcms v9判断用户是否登录(php判断数据库用户名是否存在)

  • 缴纳印花税的会计科目
  • 开票可以只开大数据吗
  • 暂估成本没有发票
  • 房地产开发企业预缴增值税
  • 应缴所得税包括哪些税种
  • 公司的旅游费怎么处理
  • 定额发票不够用可以申请额度要交税吗
  • 计提递延所得税资产
  • 递延所得税当期发生额
  • 预提返利的会计处理
  • 成本法和权益法大白话
  • 公司汽车装潢和保养做什么会计科目
  • 开了票后才收到工程款怎么做账?
  • 沥青混凝土增值税风险
  • 公司没有员工怎么零申报
  • 积分小技巧
  • 兼职教师个人所得税起征点
  • 发票密码区出格了怎么调整
  • 增值税简易征收一览表
  • 投资款缴纳印花税税目是什么
  • 电子账册需要缴纳印花税的规定是怎么说?
  • 公司支付给个人的货款怎么入账
  • 高新技术企业的行业
  • 跨年应收账款账务错误怎么调整
  • 个税退手续费怎么申请
  • 股东投资款验资后可以转出吗
  • phpget方法
  • php文件在线解密
  • php中分页功能的实现
  • 餐费如何入账
  • 产品成本核算方法
  • wordpress拿shell
  • php脚本工作流程
  • 一般纳税人在什么情况下,不可以开具增值税专用发票
  • 出口的发票怎么开视频
  • thinkphp log
  • sdiff命令 以并排方式合并文件之间的差异
  • at命令每天任务
  • 慈善组织接受股票捐赠流程
  • 利息收入怎么做账务处理
  • 织梦怎么改文字
  • logstash gsub
  • vue实现响应式的原理
  • 个人开具工程款发票
  • 费用分割单使用范围
  • 附加税费用
  • 土地增值税预缴计税依据
  • 企业影响工程成本的原因
  • 固定资产减值损失计入
  • 修理费用的会计怎么做账
  • 用友软件操作流程图片
  • 营改增企业是什么意思
  • 管理费用怎样分摊归集到产品
  • 其他应付款跨年了
  • 补偿款怎么写才能有效
  • 3%税率专票为什么不能抵扣
  • 厂房和设备折旧计入什么费用
  • 转出未交增值税借方余额表示什么
  • 研发费用是管理费用的比例多少不正常
  • 小企业如何建立风险管理制度
  • mysql 索引 语句
  • 数据库连接说明
  • microsoft onedrive怎么关闭
  • u深度u盘启动盘制作工具无法进入电脑
  • win7桌面记事本
  • win7全局搜索
  • mac如何强制关机开机
  • github比较火的项目
  • Node.js中的construct构造函数
  • Python 中urls.py:URL dispatcher(路由配置文件)详解
  • shell循环遍历目录
  • python问题及解决方法
  • node基础知识
  • javascript教程完整版
  • unity example project
  • 国家税务局浙江省电子税务局新版
  • 计算消费税为什么要除1-比例税率
  • 车辆购置税是财行税吗
  • 江苏国税局官网
  • 服务费交哪个税目的印花税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设