BH(Bottom Half)
BH机制介绍
在Linux中断中,中断的下半部分(Bottom Half)是一个很重要的概念,但实际上目前内核中的BH已经不是当初的BH了,但是由于其作用没有变化,因此仍习惯的称为BH,当初的BH是真的BH,而目前的BH是tasklet和workqeue,
Linux 2.2 内核
在linux2.2内核中bh_base[]为一个32个元素的函数指针数组,并且内核设置了两个32位无符号整数:bh_active 和bh_mask用于管理这个数组
bh_active相当于硬件中断的“中断请求寄存器”,而bh_mask相当于“中断屏蔽寄存器”需要执行一个bh函数时候就通过一个mark_bh将bh_active中的对应位置位。如果bh_mask中的相应位也是1,那么就允许这个bh函数被执行。每次执行完do_IRQ或者系统调用之后,就会在一个do_bottom_half()函数中执行这个bh函数。bh函数是严格的全局串行化执行的(不允许不同的CPU执行两个BH,即使这两个BH是不同的),在do_bottom_half在针对不对的CPU上加了锁,这个机制虽然能保证了单核处理器到SMP处理器的安全过度,但同时限制了系统的性能
Linux 2.4 内核
由于内核中已经过大量的组件使用了BH机制,单纯的删除BH机制是不行的,因此比较好的办法是保留BH函数,另外在增设一种或者几种机制,这就是2.4版本(其实从2.3版本中已经开始了)中的“软中断”机制,此时的BH机制使用了tasklet实现,tasklet->bh_action,bh_action中定义了一个global_bh_lock自旋锁,在bh_action执行时会spin_trylock(&global_bh_lock)如果global_bh_lock已经加锁则退出执行
这个时候BH的对外保留的接口没有发生变化,但是其实现已经依赖与底层的“软中断”机制了
Linux 2.6 内核
在2.5的内核中将所有使用BH的模块转移到软中断后,在2.6内核的发布中就彻底清除了BH接口,因此,虽然目前在许多书籍上使用BottomHalf的问题,但目前的BottomHalf已非当初的BH了,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律