亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 2.html

?? 介紹linux下文件和設備編程
?? HTML
?? 第 1 頁 / 共 5 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com">   <TITLE>中斷</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt">&nbsp;<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標題由此開始-->中斷</TD></TR></TABLE></CENTER><p><h3>目       錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I362">中斷</A></LI><OL><LI><A HREF="#I363">軟中斷</A></LI><LI><A HREF="#I364">硬中斷</A></LI><LI><A HREF="#I365">定時器代碼分析</A></LI><LI><A HREF="#I366">from aka</A></LI><OL><LI><A HREF="#I367">硬件中斷</A></LI><LI><A HREF="#I368">軟中斷</A></LI></OL><LI><A HREF="#I369">from lisolog</A></LI><OL><LI><A HREF="#I370">index</A></LI><LI><A HREF="#I371">內部中斷</A></LI><LI><A HREF="#I372">外部中斷</A></LI><LI><A HREF="#I373">后續處理</A></LI></OL><LI><A HREF="#I374">軟中斷代碼線索</A></LI><LI><A HREF="#I375">2. 4軟中斷機制</A></LI></OL></OL><hr><br><A NAME="I362" ID="I362"></A><center><b><font size=+2>中斷</font></b></center><br>&nbsp;&nbsp;&nbsp; Linux系統中有很多不同的硬件設備。你可以同步使用這些設備,也就是說你可以發出一個請求,然后等待一直到設備完成操作以后再進行其他的工作。但這種方法的效率卻非常的低,因為操作系統要花費很多的等待時間。一個更為有效的方法是發出請求以后,操作系統繼續其他的工作,等設備完成操作以后,給操作系統發送一個中斷,操作系統再繼續處理和此設備有關的操作。<p>&nbsp;&nbsp;&nbsp; 在將多個設備的中斷信號送往CPU的中斷插腳之前,系統經常使用中斷控制器來綜合多個設備的中斷。這樣即可以節約CPU的中斷插腳,也可以提高系統設計的靈活性。中斷控制器用來控制系統的中斷,它包括屏蔽和狀態寄存器。設置屏蔽寄存器的各個位可以允許或屏蔽某一個中斷,狀態寄存器則用來返回系統中正在使用的中斷。<p>&nbsp;&nbsp;&nbsp; 大多數處理器處理中斷的過程都相同。當一個設備發出中段請求時,CPU停止正在執行的指令,轉而跳到包括中斷處理代碼或者包括指向中斷處理代碼的轉移指令所在的內存區域。這些代碼一般在CPU的中斷方式下運行。在此方式下,將不會再有中斷發生。但有些CPU的中斷有自己的優先權,這樣,更高優先權的中斷則可以發生。這意味著第一級的中斷處理程序必須擁有自己的堆棧,以便在處理更高級別的中斷前保存CPU的執行狀態。當中斷處理完畢以后,CPU將恢復到以前的狀態,繼續執行中斷處理前正在執行的指令。<p>&nbsp;&nbsp;&nbsp; 中斷處理程序十分簡單有效,這樣,操作系統就不會花太長的時間屏蔽其他的中斷。<p>[設置Softirq]<br>&nbsp;&nbsp;&nbsp; cpu_raise_softirq是一個輪訓,喚醒ksoftirqd_CPU0內核線程, 進行管理<p>cpu_raise_softirq<br>&nbsp;&nbsp; |__cpu_raise_softirq<br>&nbsp;&nbsp; |wakeup_softirqd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |wake_up_process<p>&nbsp;&nbsp;&nbsp; &middot;cpu_raise_softirq [kernel/softirq.c]<br>&nbsp;&nbsp;&nbsp; &middot;__cpu_raise_softirq [include/linux/interrupt.h]<br>&nbsp;&nbsp;&nbsp; &middot;wakeup_softirq [kernel/softirq.c]<br>&nbsp;&nbsp;&nbsp; &middot;wake_up_process [kernel/sched.c]<p>[執行Softirq]<br>&nbsp;&nbsp; 當內核線程ksoftirqd_CPU0被喚醒, 它會執行隊列里的工作。當然ksoftirqd_CPU0也是一個死循環:<p>for (;;) {<br>&nbsp;&nbsp; if (!softirq_pending(cpu))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schedule();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __set_current_state(TASK_RUNNING);<br>&nbsp;&nbsp; while (softirq_pending(cpu)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_softirq();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (current-&gt;need_resched)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schedule<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; __set_current_state(TASK_INTERRUPTIBLE)<br>}<p>&nbsp;&nbsp;&nbsp; &middot;ksoftirqd [kernel/softirq.c]<br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I363" ID="I363"></A><center><b><font size=+2>軟中斷</font></b></center><br>發信人: fist (星仔迷), 信區: SysInternals WWW-POST<br>標&nbsp; 題: 軟中斷<br>發信站: 武漢白云黃鶴站 (Thu Mar 22 14:12:46 2001) , 轉信<p>軟中斷「一」<p>一、 引言<br>&nbsp;&nbsp;&nbsp; 軟中斷是linux系統原“底半處理”的升級,在原有的基礎上發展的新的處理方式,以適應多cpu 、多線程的軟中斷處理。要了解軟中斷,我們必須要先了原來底半處理的處理機制。<p>二、底半處理機制(基于2.0.3版本)<p>&nbsp;&nbsp;&nbsp; 某些特殊時刻我們并不愿意在核心中執行一些操作。例如中斷處理過程中。當中斷發生時處理器將停止當前的工作, 操作系統將中斷發送到相應的設備驅動上去。由于此時系統中其他程序都不能運行, 所以設備驅動中的中斷處理過程不宜過長。有些任務最好稍后執行。Linux底層部分處理機制可以讓設備驅動和Linux核心其他部分將這些工作進行排序以延遲執行。<br>&nbsp;&nbsp;&nbsp; 系統中最多可以有32個不同的底層處理過程;bh_base是指向這些過程入口的指針數組。而bh_active和 bh_mask用來表示那些處理過程已經安裝以及那些處于活動狀態。如果bh_mask的第N位置位則表示bh_base的 第N個元素包含底層部分處理例程。如果bh_active的第N位置位則表示第N個底層處理過程例程可在調度器認 為合適的時刻調用。這些索引被定義成靜態的;定時器底層部分處理例程具有最高優先級(索引值為0), 控制臺底層部分處理例程其次(索引值為1)。典型的底層部分處理例程包含與之相連的任務鏈表。例如 immediate底層部分處理例程通過那些需要被立刻執行的任務的立即任務隊列(tq_immediate)來執行。<br>&nbsp;&nbsp;&nbsp; --引自David A Rusling的《linux核心》。<p>三、對2.4.1 軟中斷處理機制<br>&nbsp;&nbsp;&nbsp; 下面,我們進入軟中斷處理部份(softirq.c):<br>&nbsp;&nbsp;&nbsp; 由softirq.c的代碼閱讀中,我們可以知道,在系統的初始化過程中(softirq_init()),它使用了兩個數組:bh_task_vec[32],softirq_vec[32]。其中,bh_task_vec[32]填入了32個bh_action()的入口地址,但soft_vec[32]中,只有softirq_vec[0],和softirq_vec[3]分別填入了tasklet_action()和tasklet_hi_action()的地址。其余的保留它用。<br>&nbsp;&nbsp;&nbsp; 當發生軟中斷時,系統并不急于處理,只是將相應的cpu的中斷狀態結構中的active 的相應的位置位,并將相應的處理函數掛到相應的隊列,然后等待調度時機來臨(如:schedule(),<br>&nbsp;&nbsp;&nbsp; 系統調用返回異常時,硬中斷處理結束時等),系統調用do_softirq()來測試active位,再調用被激活的進程在這處過程中,軟中斷的處理與底半處理有了差別,active 和mask不再對應bh_base[nr], 而是對應softirq_vec[32]。在softirq.c中,我們只涉及了softirq_vec[0]、softirq_vec[3]。這兩者分別調用了tasklet_action()和tasklet_hi_action()來進行后續處理。這兩個過程比較相似,大致如下:<p>1 鎖cpu的tasklet_vec[cpu]鏈表,取出鏈表,將原鏈表清空,解鎖,還給系統。<br>2 對鏈表進行逐個處理。<br>3 有無法處理的,(task_trylock(t)失敗,可能有別的進程鎖定),插回系統鏈表。至此,系統完成了一次軟中斷的處理。<p>接下來有兩個問題:<br>1 bh_base[]依然存在,但應在何處調用?<br>2 tasklet_vec[cpu]隊列是何時掛上的?<p><br>四、再探討<br>&nbsp;&nbsp;&nbsp; 再次考查softirq.c 的bh_action()部份,發現有兩個判斷:<br>&nbsp;&nbsp;&nbsp; A:if(!spin_trylock(&amp;global_bh_lock))goto:rescue 指明如果global_bh_lock 不能被鎖上(已被其它進程鎖上),則轉而執行rescue,將bh_base[nr]掛至tasklet_hi_vec[cpu]隊列中。等候中斷調度。<br>&nbsp;&nbsp;&nbsp; B:if(!hardirq_trylock(cpu)) goto tescue unlock 此時有硬中斷發生,放入隊列推遲執行。若為空閑,現在執行。<p>&nbsp;&nbsp;&nbsp; 由此可見,這部分正是對應底半處理的程序,bh_base[]的延時處理正是底半處理的特點,可以推測,如果沒有其它函數往tasklet_hi_vec[cpu]隊列掛入,那tasklet_hi_vec[cpu]正完全對應著bh_base[]底半處理<br>&nbsp;&nbsp;&nbsp; 在bh_action()中,把bh_ation()掛入tasklet_hi_vec[cpu]的正是mark_bh(),在整個源碼樹中查找,發現調用mark_bh()的函數很多,可以理解,軟中斷產生之時,相關的函數會調用mark_bh(),將bh_action掛上tasklet_hi_vec隊列,而bh_action()的作用不過是在發現bh_base[nr]暫時無法處理時重返隊列的方法。<br>&nbsp;&nbsp;&nbsp; 由此可推測tasklet_vec隊列的掛接應與此相似,查看interrupt.h,找到tasklet_schedule()函數:<p>157 static inline void tasklet_schedule(struct tasklet_struct *t)<br>158 {<br>159 if (!test_and_set_bit(TASKLET_STATE_SCHED, &amp;t-&gt;state)) {<br>160 int cpu = smp_processor_id();<br>161 unsigned long flags;<br>162<br>163 local_irq_save(flags);<br>164 t-&gt;next = tasklet_vec[cpu].list;<br>165 tasklet_vec[cpu].list = t; /*插入隊列。<br>166 __cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);<br>167 local_irq_restore(flags);<br>168 }<br>169 }<p>&nbsp;&nbsp;&nbsp; 正是它為tasklet_vec[cpu]隊列的建立立下了汗馬功勞,在源碼樹中,它亦被多個模塊調用,來完成它的使命。<br>&nbsp;&nbsp;&nbsp; 至此,我們可以描繪一幅完整的軟中斷處理圖了。<br>&nbsp;&nbsp;&nbsp; 現在,再來考查do_softirq()的softirq_vec[32],在interrupt.h中有如下定義:<p>56 enum<br>57 {<br>58 HI_SOFTIRQ=0,<br>59 NET_TX_SOFTIRQ,<br>60 NET_RX_SOFTIRQ,<br>61 TASKLET_SOFTIRQ<br>62 };<p>&nbsp;&nbsp;&nbsp; 這四個變量應都是為softirq_vec[]的下標,那么,do_softirq()也將會處理NET_TX_SOFTIRQ和NET_RX_SOFTIRQ,是否還處理其它中斷,這有待探討。也許,這個do_softirq()有著極大的拓展性,等著我們去開發呢。<p>&nbsp;&nbsp;&nbsp; 主要通過__cpu_raise_softirq來設置<br>&nbsp;&nbsp;&nbsp; 在hi_tasklet(也就是一般用于bh的)的處理里面,在處理完當前的隊列后,會將補充的隊列重新掛上,然后標記(不管是否補充隊列里面有tasklet):<p>local_irq_disable();<br>t-&gt;next = tasklet_hi_vec[cpu].list;<br>tasklet_hi_vec[cpu].list = t;<br>__cpu_raise_softirq(cpu, HI_SOFTIRQ);<br>local_irq_enable();<p>&nbsp;&nbsp;&nbsp; 因此,對mark_bh根本不用設置這個active位。對于一般的tasklet也一樣:<p>local_irq_disable();<br>t-&gt;next = tasklet_vec[cpu].list;<br>tasklet_vec[cpu].list = t;<br>__cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);<br>local_irq_enable();<p>&nbsp;&nbsp;&nbsp; 其它的設置,可以檢索上面的__cpu_raise_softirq<p>bottom half, softirq, tasklet, tqueue<br>[bottom half]<br>bh_base[32]<br>|<br>\/<br>bh_action();<br>|<br>\/<br>bh_task_vec[32];<br>| mark_bh(), tasklet_hi_schedule()<br>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久久久久久久久久久久| 色就色 综合激情| 欧美人与性动xxxx| 一区二区三区欧美日| 99亚偷拍自图区亚洲| 香蕉乱码成人久久天堂爱免费| 欧美极品aⅴ影院| 国产丝袜在线精品| 国产精品久久久久一区| 国产亚洲综合性久久久影院| 久久亚洲二区三区| 久久久久久99精品| 国产拍揄自揄精品视频麻豆| 久久久电影一区二区三区| 欧美日韩国产a| 精品日韩在线观看| 国产色产综合产在线视频| 精品久久久影院| 国产精品萝li| 一区二区免费在线| 午夜亚洲国产au精品一区二区| 免费xxxx性欧美18vr| 一本大道av伊人久久综合| 日韩一区二区三区四区 | 一二三区精品福利视频| 奇米四色…亚洲| 久久97超碰国产精品超碰| 91激情五月电影| 成人免费一区二区三区在线观看| 天天射综合影视| 99精品久久久久久| 国产精品久久久久久久久久久免费看 | 一区二区三区自拍| 粉嫩一区二区三区在线看| 精品国产sm最大网站免费看| 日本成人超碰在线观看| 欧美一区二区视频网站| 99国产精品久久久久久久久久| 粉嫩在线一区二区三区视频| 1024成人网色www| 日韩一区国产二区欧美三区| 国产成人精品免费一区二区| 亚洲免费av在线| 欧美sm极限捆绑bd| 色综合久久中文综合久久97 | 91久久人澡人人添人人爽欧美| 日韩主播视频在线| 国产女人aaa级久久久级| 99久久精品情趣| 日韩av网站在线观看| 国产精品久久福利| 欧美日韩精品是欧美日韩精品| 亚洲女同女同女同女同女同69| 欧美一区二区三区影视| 极品少妇xxxx精品少妇| 亚洲色图欧美偷拍| 欧美一级免费观看| 91年精品国产| 国产一区二区精品久久| 亚洲电影一级片| 亚洲视频狠狠干| 国产日产欧美精品一区二区三区| 在线播放视频一区| 91网站最新网址| 国产毛片精品视频| 日韩av成人高清| 丝袜亚洲精品中文字幕一区| 国产精品久久久久久久久快鸭 | 日韩成人av影视| 亚洲国产精品久久久男人的天堂| 国产精品久久久久影视| 欧美成人精精品一区二区频| 欧美色倩网站大全免费| 99re热视频精品| 99精品视频在线观看| 成人av综合在线| av激情综合网| 在线看不卡av| 欧美裸体bbwbbwbbw| 欧美军同video69gay| 欧美日韩二区三区| 欧美三区在线视频| 欧美老年两性高潮| 欧美一级在线免费| 日韩精品在线网站| 欧美系列日韩一区| 日韩一区二区电影在线| 久久免费精品国产久精品久久久久| 日韩精品一区二区三区在线播放| 欧美一区二区私人影院日本| 日韩一级黄色大片| 日韩视频免费观看高清在线视频| 欧美一区二区三区视频在线观看| 欧美精品一区二区在线播放| 久久久久久久久久久电影| 国产精品久久久久久户外露出 | 午夜久久福利影院| 国产乱国产乱300精品| 一本大道av一区二区在线播放| 欧美日韩电影在线播放| 国产亚洲一区二区三区在线观看 | 宅男噜噜噜66一区二区66| 久久影院电视剧免费观看| 亚洲男人都懂的| 久久99这里只有精品| 欧美性欧美巨大黑白大战| 久久这里只精品最新地址| 香蕉影视欧美成人| 色先锋久久av资源部| 久久久三级国产网站| 人人爽香蕉精品| 欧美日韩精品福利| 夜夜爽夜夜爽精品视频| 高清av一区二区| 国产偷国产偷亚洲高清人白洁 | 日韩三级电影网址| 亚洲国产精品麻豆| 欧美影视一区在线| 一区二区三区电影在线播| www.亚洲人| 久久众筹精品私拍模特| 蜜臀av在线播放一区二区三区| 欧美亚洲图片小说| 亚洲一区二区在线免费观看视频| 成人一区二区视频| ●精品国产综合乱码久久久久| 国产不卡免费视频| 国产婷婷色一区二区三区| 国产精品资源在线看| 国产女人18水真多18精品一级做| 国产精品一线二线三线精华| 欧美tk—视频vk| 成人污污视频在线观看| 亚洲欧美日韩久久精品| 欧美性受极品xxxx喷水| 日韩高清在线一区| 久久婷婷色综合| 成人激情av网| 亚洲 欧美综合在线网络| 欧美一区二区视频在线观看2022| 韩日精品视频一区| 国产精品午夜电影| 欧美日韩中字一区| 激情综合网av| 亚洲影院久久精品| 久久久久国产精品厨房| 欧美色倩网站大全免费| 国产资源在线一区| 亚洲第一福利一区| 精品久久一区二区| 在线观看日韩一区| 国产一区二区免费看| 亚洲国产欧美日韩另类综合| 欧美变态tickle挠乳网站| 日韩精品一区二区三区在线| 在线免费观看日本一区| 岛国av在线一区| 久久成人精品无人区| 洋洋成人永久网站入口| 国产三级一区二区| 日韩精品最新网址| 色国产综合视频| av在线播放一区二区三区| 国产精品乡下勾搭老头1| 麻豆精品一区二区三区| 免费观看日韩av| 美国十次了思思久久精品导航| 亚洲一区中文在线| 夜夜嗨av一区二区三区中文字幕| 国产精品卡一卡二| 国产精品成人免费在线| 亚洲欧洲av在线| 亚洲最快最全在线视频| 亚洲国产美国国产综合一区二区| 亚洲图片激情小说| 亚洲美女屁股眼交3| 亚洲成人高清在线| 蜜臀av性久久久久蜜臀aⅴ| 另类的小说在线视频另类成人小视频在线 | 久久久久久久国产精品影院| av在线播放成人| 蜜臀av一区二区在线观看| 中文字幕一区免费在线观看| 亚洲成人动漫一区| 91久久久免费一区二区| 日本一二三四高清不卡| 国产乱子伦视频一区二区三区 | 成人网男人的天堂| 欧美年轻男男videosbes| 精品国产露脸精彩对白| 亚洲日本在线观看| 美洲天堂一区二卡三卡四卡视频 | 亚洲欧美日韩综合aⅴ视频| 丝袜国产日韩另类美女| 91久久精品午夜一区二区| 欧美精品一区二区在线播放| 一区av在线播放| 91理论电影在线观看| 久久久久久亚洲综合| 美腿丝袜一区二区三区|