欢迎来到天天文库
浏览记录
ID:14900729
大小:94.50 KB
页数:12页
时间:2018-07-30
《linux 内核软中断(softirq)执行分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux内核软中断(softirq)执行分析Author: sinisterEmail: sinister@whitecell.orgHomepage:http://www.whitecell.orgDate: 2007-01-11本文对Linux内核软中断的执行流程进行了分析,并尽可能的结合当前运行环境详细地写出我的理解,但这并不表明我的理解一定正确。这本是论坛里的一篇帖子,发出来是为了抛砖引玉,如果您在阅读本文时发现了我的错误,还望得到您的指正。今天无意中看了眼2.6内核的软中断实现,发现和以前我看到的大不相同(以前也是走马观花,不大仔细),可以说改动很大。连s
2、oftirq的调用点都不一样了,以前是三个调用点,今天搜索了一下源代码,发现在多出了ksoftirqd后,softirq在系统中的调用点仅是在ISR返回时和使用了local_bh_enable()函数后被调用了。网卡部分的显示调用,我觉得应该不算是系统中的调用点。ksoftirqd返回去调用do_softirq()函数应该也只能算是其中的一个分支,因为其本身从源头上来讲也还是在ISR返回时irq_exit()调用的。这样一来就和前些日子写的那份笔记(Windows/Linux/Solaris软中断机制)里介绍的Linux内核部分的软中断有出处了,看来以后讨论Linuxkernel
3、代码一定要以内核版本为前题,要不非乱了不可。得买本Linux方面的书了,每次上来直接看相关代码也不是回事,时间也不允许。////do_IRQ函数执行完硬件ISR后退出时调用此函数。//voidirq_exit(void){account_system_vtime(current);trace_hardirq_exit();sub_preempt_count(IRQ_EXIT_OFFSET);////判断当前是否有硬件中断嵌套,并且是否有软中断在//pending状态,注意:这里只有两个条件同时满足//时,才有可能调用do_softirq()进入软中断。也就是//说确认当前所有硬件
4、中断处理完成,且有硬件中断安装了//软中断处理时理时才会进入。//if(!in_interrupt()&&local_softirq_pending())////其实这里就是调用do_softirq()执行//invoke_softirq();preempt_enable_no_resched();}#ifndef__ARCH_HAS_DO_SOFTIRQasmlinkagevoiddo_softirq(void){__u32pending;unsignedlongflags;////这个函数判断,如果当前有硬件中断嵌套,或者//有软中断正在执行时候,则马上返回。在这个//入口判
5、断主要是为了与ksoftirqd互斥。//if(in_interrupt())return;////关中断执行以下代码//local_irq_save(flags);////判断是否有pending的软中断需要处理。//pending=local_softirq_pending();////如果有则调用__do_softirq()进行实际处理//if(pending)__do_softirq();////开中断继续执行//local_irq_restore(flags);}////最大软中断调用次数为10次。//#defineMAX_SOFTIRQ_RESTART10asmlin
6、kagevoid__do_softirq(void){////软件中断处理结构,此结构中包括了ISR中//注册的回调函数。//structsoftirq_action*h;__u32pending;intmax_restart=MAX_SOFTIRQ_RESTART;intcpu;////得到当前所有pending的软中断。//pending=local_softirq_pending();account_system_vtime(current);////执行到这里要屏蔽其他软中断,这里也就证明了//每个CPU上同时运行的软中断只能有一个。//__local_bh_disabl
7、e((unsignedlong)__builtin_return_address(0));trace_softirq_enter();////针对SMP得到当前正在处理的CPU//cpu=smp_processor_id();////循环标志//restart:////每次循环在允许硬件ISR强占前,首先重置软中断//的标志位。///*Resetthependingbitmaskbeforeenablingirqs*/set_softirq_pending(0);////到这里才
此文档下载收益归作者所有