❶ linux涓鏂绋嫔簭鎸囦护linux涓鏂绋嫔簭
linux濡备綍寮哄埗涓鏂锛
llinux寮哄埗涓鏂镄勫懡浠ゆ湁浠ヤ笅涓や釜锛
linux锅沧㈠懡浠ゆ柟娉曚竴
缁堟㈠綋鍓嶆e湪镓ц岀殑镆愪釜锻戒护链蹇镄勬柟娉曟槸鎸変笅缁勫悎阌钬淐trl+C钬濄傝繖涓鏂规硶鍙链夊湪鐢ㄦ埛鑳藉熶粠镆愪釜铏氭嫙鎺у埗鍙颁笂鎺у埗杩欎釜绋嫔簭镄勬椂鍊欐墠濂忔晥銆
linux锅沧㈠懡浠ゆ柟娉曚簩
缁堟㈡煇涓鍑洪敊绋嫔簭镄勫彟澶栦竴涓锷炴硶鏄痥ill(𨱒)鎺夊畠镄勮繘绋嬨傝锋寜镦т笅闱㈢殑鏂规硶杩涜屾搷浣滐细
1)杈揿叆钬减s钬濆懡浠よ幏鍙栬繘绋嬬殑PID锛岃繖涓锻戒护瑕佹眰浣犳槸杩愯岃繖涓绋嫔簭镄勯偅涓浜烘垨钥呮槸镙圭敤鎴枫傚傛灉鏄镙圭敤鎴凤纴璇疯緭鍏モ减s-aux钬濆懡浠ゆ煡鐪嬫墍链夌殑杩涚▼锛屼笉绠℃槸璋佹嫢链夊畠浠镄勚
2)鍦ㄦ竻鍗曚腑镓惧埌杩欎釜鍑洪敊杩涚▼銆傚洜涓虹▼搴忕殑钖岖О鍒楀湪娓呭崟镄勬渶鍙宠竟锛岄氩父涓鐪煎氨鍙浠ユ垒鍒板畠銆
3)璇疯颁笅ps锻戒护杈揿嚭娓呭崟涓杩涚▼鐘舵佽屾渶宸﹁竟镄処D鏁板瓧銆
4)杈揿叆钬渒illID钬濓纴缁堟㈣ヨ繘绋嬨
linux鍝涓椹卞姩澶勭悊绯荤粺涓鏂锛
涓嶭inux璁惧囬┍锷ㄤ腑涓鏂澶勭悊鐩稿叧镄勯栧厛鏄鐢宠蜂笌閲婃斁IRQ镄𪞝PIrequest_irq()鍜宖ree_irq()锛宺equest_irq()镄勫师鍨嬩负锛歩ntrequest_irq(unsignedintirq,void(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongirqflags,constchar*devname,void*dev_id);irq鏄瑕佺敌璇风殑纭浠朵腑鏂鍙凤绂handler鏄钖戠郴缁熺橱璁扮殑涓鏂澶勭悊鍑芥暟锛屾槸涓涓锲炶皟鍑芥暟锛屼腑鏂鍙戠敓镞讹纴绯荤粺璋幂敤杩欎釜鍑芥暟锛宒ev_id鍙傛暟灏呜浼犻掞绂irqflags鏄涓鏂澶勭悊镄勫睘镐э纴鑻ヨ剧疆SA_INTERRUPT锛屾爣鏄庝腑鏂澶勭悊绋嫔簭鏄蹇阃熷勭悊绋嫔簭锛屽揩阃熷勭悊绋嫔簭琚璋幂敤镞跺睆钄芥墍链変腑鏂锛屾参阃熷勭悊绋嫔簭涓嶅睆钄斤绂鑻ヨ剧疆SA_SHIRQ锛屽垯澶氢釜璁惧囧叡浜涓鏂锛宒ev_id鍦ㄤ腑鏂鍏变韩镞朵细鐢ㄥ埌锛屼竴鑸璁剧疆涓鸿繖涓璁惧囩殑device缁撴瀯链韬鎴栬匩ULL銆
linux涓鏂链哄埗涓昏佹濇兂锛
Linux灏嗕腑鏂澶勭悊杩囩▼鍒嗘垚浜嗕袱涓阒舵碉纴涔熷氨鏄涓婂崐閮ㄥ拰涓嫔崐閮ㄣ备笂鍗婇儴鐢ㄦ潵蹇阃熷勭悊涓鏂锛屽畠鍦ㄤ腑鏂绂佹㈡ā寮忎笅杩愯岋纴涓昏佸勭悊璺熺‖浠剁揣瀵嗙浉鍏崇殑鎴栨椂闂存晱镒熺殑宸ヤ綔銆备篃灏辨槸鎴戜滑甯歌寸殑纭涓鏂锛岀壒镣规槸蹇阃熸墽琛屻备笅鍗婇儴鐢ㄦ潵寤惰繜澶勭悊涓婂崐閮ㄦ湭瀹屾垚镄勫伐浣滐纴阃氩父浠ュ唴镙哥嚎绋嬬殑鏂瑰纺杩愯屻备篃灏辨槸鎴戜滑甯歌寸殑杞涓鏂锛岀壒镣规槸寤惰繜镓ц屻
Linux涓链夌‖浠朵腑鏂鍜岃蒋浠朵腑鏂銆备絾鏄瀵逛簬纭浠朵腑鏂镄勫勭悊链変袱涓铡熷垯锛氢笉鑳藉祵濂楋纴瓒婂揩瓒婂ソ銆傦纸镞╄捣Linux鐗堟湰鏄鏀鎸佷腑鏂宓屽楋级
褰揂RM澶勭悊鍣ㄦ敹鍒颁腑鏂镄勬椂鍊欙纴瀹冭繘鍏ヤ腑鏂妯″纺锛屽悓镞禔RM澶勭悊鍣ㄧ殑CPSR瀵勫瓨鍣ㄧ殑IRQ浣崭细琚纭浠惰剧疆涓哄睆钄绌RQ銆
linux涓鏂锻戒护锛
Tab銆
杩欐槸浣犱笉鑳芥病链夌殑Linux蹇鎹锋柟寮忋傚畠灏嗕负鎭ㄨ妭鐪丩inux锻戒护琛屼腑镄勫ぇ閲忔椂闂淬
鍙闇杈揿叆锻戒护銆佹枃浠跺悕銆佺洰褰曞悕鐢氲呖锻戒护阃夐”锛岀劧钖庡崟鍑籘ab阌锛屽畠浼氲嚜锷ㄥ畬鎴愭偍杈揿叆镄勫唴瀹癸纴鎴栬呬细鏄剧ず镓链夊彲鑳界殑缁撴灉銆
Ctrl+C銆
杩欎釜缁勫悎鑳藉湪缁堢涓娄腑鏂锻戒护鎴栬繘绋嬨傛寜涓嫔畠灏嗙珛鍗冲仠姝㈡e湪杩愯岀殑绋嫔簭銆
鍦╨inux涓濡备綍缁堟㈡寚浠ょ殑杩愯岋纻
1銆侀栧厛镓揿紑linux缁堢锛岃繍琛屼竴娈礟ython绋嫔簭锛
2銆佺劧钖庡湪绋嫔簭杩愯屼腑锛岄渶瑕佺粓姝㈢▼搴忚繍琛屾椂锛屾寜涓嫔揩鎹烽敭crtl锛媍灏卞彲浠ョ粓姝㈡寚浠ょ▼搴忥纴姝ゆ椂杩愯岀殑杩欐祊ython绋嫔簭灏辫缁堟浜嗐傛墍链夌殑鎸囦护閮藉彲浠ョ敤杩欎釜蹇鎹烽敭缁堟㈣繍琛岋细
3銆佹渶钖庡啀娆¤繍琛屼竴涓嫔垰镓岖殑绋嫔簭锛岃繖閲岀洿鎺ヤ娇鐢–trl+Z蹇鎹烽敭缁堟㈣繍琛岀▼搴忔槸鍙浠ヨ揪鍒板悓镙风殑鏁堟灉镄勶细
❷ 《Linux设备驱动程序》(十六)-中断处理
设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。
让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。
2.6内核的函数参数与现在的参数有所区别,这里都主要介绍概念,具体实现方法需要结合具体的内核版本。
request_irq函数申请中断,返回0表示申请成功,其他返回值表示申请失败,其具体参数解释如下:
flags 掩码可以使用以下几个:
快速和慢速处理例程 :现代内核中基本没有这两个概念了,使用SA_INTERRUPT位后,当中断被执行时,当前处理器的其他中断都将被禁止。通常不要使用SA_INTERRUPT标志位,除非自己明确知道会发生什么。
共享中断 :使用共享中断时,一方面要使用SA_SHIRQ位,另一个是request_irq中的dev_id必须是唯一的,不能为NULL。这个限制的原因是:内核为每个中断维护了一个共享处理例程的列表,例程中的dev_id各不相同,就像设备签名。如果dev_id相同,在卸载的时候引起混淆(卸载了另一个中断),当中断到达时会产生内核OOP消息。
共享中断需要满足以下一个条件才能申请成功:
当不需要使用该中断时,需要使用free_irq释放中断。
通常我们会在模块加载的时候申请安装中断处理例程,但书中建议:在设备第一次打开的时候安装,在设备最后一次关闭的时候卸载。
如果要查看中断触发的次数,可以查看 /proc/interrupts 和 /proc/stat。
书中讲述了如何自动检测中断号,在嵌入式开发中通常都是查看原理图和datasheet来直接确定。
自动检测的原理如下:驱动程序通知设备产生中断,然后查看哪些中断信号线被触发了。Linux提供了以下方法来进行探测:
探测工作耗时较长,建议在模块加载的时候做。
中断处理函数和普通函数其实差不多,唯一的区别是其运行的中断上下文中,在这个上下文中有以下注意事项:
中断处理函数典型用法如下:
中断处理函数的参数和返回值含义如下:
返回值主要有两个:IRQ_NONE和IRQ_HANDLED。
对于中断我们是可以进行开启和关闭的,Linux中提供了以下函数操作单个中断的开关:
该方法可以在所有处理器上禁止或启用中断。
需要注意的是:
如果要关闭当前处理器上所有的中断,则可以调用以下方法:
local_irq_save 会将中断状态保持到flags中,然后禁用处理器上的中断;如果明确知道中断没有在其他地方被禁用,则可以使用local_irq_disable,否则请使用local_irq_save。
locat_irq_restore 会根据上面获取到flags来恢复中断;local_irq_enable 会无条件打开所有中断。
在中断中需要做一些工作,如果工作内容太多,必然导致中断处理所需的时间过长;而中断处理又要求能够尽快完成,这样才不会影响正常的系统调度,这两个之间就产生了矛盾。
现在很多操作系统将中断分为两个部分来处理上面的矛盾:顶半部和底半部。
顶半部就是我们用request_irq来注册的中断处理函数,这个函数要求能够尽快结束,同时在其中调度底半部,让底半部在之后来进行后续的耗时工作。
顶半部就不再说明了,就是上面的中断处理函数,只是要求能够尽快处理完成并返回,不要处理耗时工作。
底半部通常使用tasklet或者工作队列来实现。
tasklet的特点和注意事项:
工作队列的特点和注意事项:
❸ Linux进入临界去开关中断的几种方式
进入中断时候关闭全局的中断是为了避免程序处理中断过程中,再进入另一个中断打乱执行的顺序,也就是为了防止中断嵌套的情况发生。比如在irq_handler函数中首先就应该关闭中断。或者,在某些操作顺序中是不允许中断发生打断的情况。例如在驱动中常用的方式:
unsigned int flag;
local_irq_save(&flag);
... ... ... ...
local_irq_restore(&flag);
spin_loc_irqsave 禁止中断(只在本地处理器)在获得自旋锁之前; 之前的中断状态保存在 flags 里. 如果你绝对确定在你的处理器上没有禁止中断的(或者, 换句话说, 你确信你应当在你释放你的自旋锁时打开中断),你可以使用 spin_lock_irq 代替, 并且不必保持跟踪 flags. 最后, spin_lock_bh 在获取锁之前禁止软件中断, 但是硬件中断留作打开的。
❹ linux内核在执行中断处理时是关中断的吗
1、中断处理程序与其他内核函数真正的区别在于,中断处理程序是被内核调用来相应中断的,而它们运行于中断上下文(原子上下文)中,在该上下文中执行的代码不可阻塞。中断就是由硬件打断操作系统。
2、异常与中断不同,它在产生时必须考虑与处理器时钟同步。异常被称为同步中断,例如:除0、缺页异常、陷入内核(trap)引起系统调用处理程序异常。
3、不同的设备对应的中断不同,而每个中断都通过一个唯一的数字(中断号)标识。
4、既想让中断处理程序运行得快,又想中断处理程序完成的工作量多,为了在这两个相悖的目标之间达到一种平衡,一般把中断处理分为两个部分。中断处理程序是上半部(top half):接收到一个中断,它就立刻开始执行,但只做有严格时限的工作,例如对接受的中断进行应答或者复位硬件,这些工作都是在中断被禁止的情况下完成的(上半部情况下,中断被禁止);另一部分是下半部(bottom half):能够被允许稍后完成的工作会推迟到下半部。
❺ 如何关闭linux smp中断
在多 CPU 的环境中,还有一个中断平衡的问题,比如,网卡中断会教给哪个 CPU 处理,这个参数控制哪些 CPU 可以绑定 IRQ 中断。其中的 {number} 是对应设备的中断编号,可以用下面的命令找出:
cat /proc/interrupt
比如,一般 eth0 的 IRQ 编号是 16,所以控制 eth0 中断绑定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面这个命令还可以看到某些中断对应的CPU处理的次数,缺省的时候肯定是不平衡的。
设置其值的方法很简单,smp_affinity 自身是一个位掩码(bitmask),特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。
几乎所有外设都有这个参数设置,可以关注一下。
这个数值的推荐设置,其实在很大程度上,让专门的CPU处理专门的中断是效率最高的,比如,给磁盘IO一个CPU,给网卡一个CPU,这样是比较合理的。
现在的服务器一般都是多核了,但是中断很多时候都是只用一个核,如果有些中断要求比较高,可以把它独立分配给一个cpu使用。
❻ linux下 软中断处理函数do_softirq中用了local_irq_disable()来屏蔽中断
中断屏蔽,确实会导致中断丢失。但是,中断控制器本身会保证中断不被丢失。对于水平触发中断,一个中断发送出去,如果没有cpu的ack,会一直悬停在那,直到相应为止。一个边缘触发的中断,是设计成可以丢失的中断,丢失了也无所谓。因为中断控制器会重发。
对于网络数据中的大量中断,有NAPI的方式来实现。