悟空学Linux专栏----第43篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wukonglinux/article/details/46874115

  按照圆方的建议,悟空打开了无线驱动的debugfs功能。悟空通过模拟大数据通信的场景,测试了一个多小时候,发现无线果然不再发送数据了。悟空查看了debugfs之后,发现发送队列的状态位和802.11协议栈的状态出现了冲动。发送队列的状态为显示为802.11协议栈没有挂起,而802.11协议栈的状态却是挂起的状态。这让悟空怎么也想不通,所以悟空再次找到了圆方。

  悟空曰:从测试的结果来看,发送队列的状态位,和802.11协议栈的状态位没有对应上。那么是什么原因导致了没有对应起来呢?圆方,你怎么看呢?

  圆方曰:我们先来分析一下发送的挂起流程。


  从这个图中我们可以看出设置802.11状态为的挂起和真正挂起802.11网络协议栈,其实是由两步组成的,所以我分析猜测,应该是在这两步之间被其他的程序修改了状态位的值。

  悟空曰:不可能啊,程序中虽然是由两步组成,但是在这两部之间设计人员已经加入了自旋锁啊。加入自旋锁之后按理来说,是不应该被打断的啊,难道是灵异事件。圆方,你怎么看呢?

  圆方曰:自旋锁的使用分很多种方法的,而且自旋锁是不能被进程和软中断打断,但是却可以被中断打断。因此如果在这两步之间插入一个中断,而且这个中断还修改了状态位的值,就会出现我们现在测试的情况。

  悟空曰:那么怎样才能不让中断打断呢?

  圆方曰:其实很简单,可以直接使用关中断自旋锁。

阅读更多
换一批

没有更多推荐了,返回首页