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了,

posted on   sudochen  阅读(1206)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示