版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Linux操作系統(tǒng)分析主講:陳香蘭助教:賈永泉、毛熠璐xlanchen@3606864-83(西區(qū)電三421)Autumn2007xlanchen@2007.9.271LinuxOperatingSystemAnalysis上次課進程的創(chuàng)建進程調度xlanchen@2007.9.272LinuxOperatingSystemAnalysis中斷和異常xlanchen@2007.9.27xlanchen@2007.9.273LinuxOperatingSystemAnalysis為什么會有中斷內核的一個主要功能就是處理硬件處理器速度一般比外設快很多內核必須處理其他任務,只有當外設真正完成了準備好了時CPU才轉過來處理外設也可以用輪詢的方式來處理,但顯然效率不高中斷機制就是滿足上述條件的一種解決辦法xlanchen@2007.9.274LinuxOperatingSystemAnalysis主要內容中斷信號的作用和中斷信號處理的一般原則I/O設備如何引起CPU中斷x86CPU如何在硬件級處理中斷信號Linux內核中軟件級中斷處理及其數據結構xlanchen@2007.9.275LinuxOperatingSystemAnalysis中斷和異常中斷(廣義)會改變處理器執(zhí)行指令的順序,通常與CPU芯片內部或外部硬件電路產生的電信號相對應中斷——異步的:
由硬件隨機產生,在程序執(zhí)行的任何時候可能出現異常——同步的:
在(特殊的或出錯的)指令執(zhí)行時由CPU控制單元產生我們用“中斷信號”來通稱這兩種類型的中斷xlanchen@2007.9.276LinuxOperatingSystemAnalysis中斷信號的作用中斷信號提供了一種特殊的方式,使得CPU轉去運行正常程序之外的代碼比如一個外設采集到一些數據,發(fā)出一個中斷信號,CPU必須立刻響應這個信號,否則數據可能丟失當一個中斷信號到達時,CPU必須停止它當前正在做的事,并且切換到一個新的活動為了做到這這一點,在進程的內核態(tài)堆棧保存程序計數器的當前值(即eip和cs寄存器),并把與中斷信號相關的一個地址放入進程序計數器xlanchen@2007.9.277LinuxOperatingSystemAnalysis中斷信號的處理原則快!當內核正在做一些別的事情的時候,中斷會隨時到來。無辜的正在運行的代碼被打斷中斷處理程序在run的時候可能禁止了同級中斷中斷處理程序對硬件操作,一般硬件對時間也是非常敏感的內核的目標就是讓中斷盡可能快的處理完,盡其所能把更多的處理向后推遲上半部分(topbottom)和下半部分(halfbottom)xlanchen@2007.9.278LinuxOperatingSystemAnalysis允許不同類型中斷的嵌套發(fā)生,這樣能使更多的I/O設備處于忙狀態(tài)盡管內核在處理一個中斷時可以接受一個新的中斷,但在內核代碼中還在存在一些臨界區(qū),在臨界區(qū)中,中斷必須被禁止xlanchen@2007.9.279LinuxOperatingSystemAnalysis中斷上下文中斷上下文不同于進程上下文中斷或異常處理程序執(zhí)行的代碼不是一個進程它是一個內核控制路徑,代表了中斷發(fā)生時正在運行的進程執(zhí)行作為一個進程的內核控制路徑,中斷處理程序比一個進程要“輕”(中斷上下文只包含了很有限的幾個寄存器,建立和終止這個上下文所需要的時間很少)xlanchen@2007.9.2710LinuxOperatingSystemAnalysis中斷上下文舉例分析A,B,C,D在互相搶占上的關系 假設: 2個interruptcontext,記為A和B 2個process,記為C和D1,假設某個時刻C占用CPU運行,此時A中斷發(fā)生,C被A搶占,A得以在CPU上執(zhí)行。 由于Linux不為中斷處理程序設置processcontext,A只能使用C的kernelstack作為自己的運行棧xlanchen@2007.9.2711LinuxOperatingSystemAnalysis2,無論如何,Linux的interruptcontextA絕對不會被某個進程C或者D搶占?。?這是由于所有已經啟動的interruptcontexts,不管是interruptcontexts之間切換,還是在某個interruptcontext中執(zhí)行代碼的過程,決不可能插入scheduler調度例程的調用。 除非interruptcontext主動或者被動阻塞進入睡眠,喚起scheduler,但這是必須避免的,危險性見第3點說明。xlanchen@2007.9.2712LinuxOperatingSystemAnalysis3,關于第2點的解釋:首先,interruptcontext沒有processcontext,如果被某個進程搶占之后就沒法恢復到原來的interruptcontext下了,這即損害了A的利益也污染了C的kernelstack。 其次,如果interruptcontextA由于阻塞或是其他原因睡眠,外界對系統(tǒng)的響應能力將變得不可忍受xlanchen@2007.9.2713LinuxOperatingSystemAnalysis4,那么interruptcontextA和B的關系又如何呢? 由于可能在interruptcontext的某個步驟打開了CPU的IFflag標志,這使得在A過程中,B的irqline已經觸發(fā)了PIC,進而觸發(fā)了CPUIRQpin,使得CPU執(zhí)行中斷B的interruptcontext,這是中斷上下文的嵌套過程。5,通常Linux不對不同的interruptcontexts設置優(yōu)先級,這種任意的嵌套是允許的 當然可能某個實時Linux的patch會不允許低優(yōu)先級的interruptcontext搶占高優(yōu)先級的interruptcontextxlanchen@2007.9.2714LinuxOperatingSystemAnalysis中斷和異常的分類(Intel文檔)中斷分為:可屏蔽中斷(Maskableinterrupt)I/O設備發(fā)出的所有中斷請求(IRQ)都可以產生可屏蔽中斷。可屏蔽中斷可以處于兩種狀態(tài):屏蔽的(masked)和非屏蔽的(unmasked)非屏蔽中斷(Nonmaskableinterrupt)只有幾個特定的危急事件才引起非屏蔽中斷。如硬件故障或是掉電xlanchen@2007.9.2715LinuxOperatingSystemAnalysis異常分為:處理器探測異常由CPU執(zhí)行指令時探測到一個反常條件時產生,如溢出、除0錯等編程異常由編程者發(fā)出的特定請求產生,通常由int類指令觸發(fā)通常叫做“軟中斷”例如系統(tǒng)調用xlanchen@2007.9.2716LinuxOperatingSystemAnalysis對于處理器探測異常,根據異常時保存在內核堆棧中的eip的值可以進一步分為:故障(fault):eip=引起故障的指令的地址通??梢约m正,處理完異常時,該指令被重新執(zhí)行例如缺頁異常陷阱(trap):eip=隨后要執(zhí)行的指令的地址。異常中止(abort):eip=???發(fā)生嚴重的錯誤。eip值無效,只有強制終止受影響的進程xlanchen@2007.9.2717LinuxOperatingSystemAnalysis中斷向量每個中斷和異常由0~255之間的一個數(8位)來標識,Intel稱其為中斷向量。非屏蔽中斷的向量和異常的向量是固定的可屏蔽中斷的向量可以通過對中斷控制器的編程來改變xlanchen@2007.9.2718LinuxOperatingSystemAnalysis中斷的產生每個能夠發(fā)出中斷請求的硬件設備控制器都有一條稱為IRQ(Interrupt
ReQuest)的輸出線。所有的IRQ線都與一個中斷控制器的輸入引腳相連中斷控制器與CPU的INTR引腳相連設備設備控制器中斷控制器IRQCPUINTRxlanchen@2007.9.2719LinuxOperatingSystemAnalysis中斷控制器執(zhí)行下列動作:1,監(jiān)視IRQ線,對引發(fā)信號檢查2,如果一個引發(fā)信號出現在IRQ線上a,把此信號轉換成對應的中斷向量b,把這個向量存放在中斷控制器的一個I/O端口,從而允許CPU通過數據總線讀這個向量c,把引發(fā)信號發(fā)送到處理器的INTR引腳,即產生一個中斷d,等待,直到CPU應答這個信號;收到應答后,清INTR引腳3,返回到第一步xlanchen@2007.9.2720LinuxOperatingSystemAnalysisIRQ號和中斷向量號中斷控制器對輸入的IRQ線從0開始順序編號IRQ0,IRQ1,…Intel給中斷控制器分配的中斷向量號從32開始,上述IRQ線對應的中斷向量依次是32+0、32+1、…可以對中斷控制器編程:修改起始中斷向量的值,或有選擇的屏蔽/激活每條IRQ線屏蔽≠丟失xlanchen@2007.9.2721LinuxOperatingSystemAnalysis屏蔽的中斷不會丟失一旦被激活,中斷控制器又會將它們發(fā)送到CPU有選擇的屏蔽/激活IRQ線
≠全局屏蔽/激活前者通過對中斷控制器編程實現后者通過特定的指令操作CPU中的狀態(tài)字xlanchen@2007.9.2722LinuxOperatingSystemAnalysisI386:開中斷和關中斷CPU可以將屏蔽所有的可屏蔽終端Eflags中的IF標志:
0=關中斷;
1=開中斷。關中斷時,CPU不響應中斷控制器發(fā)布的任何中斷請求內核中使用cli和sti指令分別清除和設置該標志xlanchen@2007.9.2723LinuxOperatingSystemAnalysis傳統(tǒng)的中斷控制器:8259A傳統(tǒng)的中斷控制器使用兩片8259A以“級聯”的方式連接在一起每個芯片可以處理最多8個不同的IRQ線主從兩片8259A的連接:從主的IRQ2引腳因此,一共可以處理最多15個不同的IRQ線xlanchen@2007.9.2724LinuxOperatingSystemAnalysis8259A:設置起始中斷向量號xlanchen@2007.9.2725LinuxOperatingSystemAnalysis8259A:禁止/激活某個IRQ線取變量的第x個字節(jié)xlanchen@2007.9.2726LinuxOperatingSystemAnalysis異常X86處理器發(fā)布了大約20種不同的異常。某些異常通過硬件出錯碼說明跟異常相關的信息內核為每個異常提供了一個專門的異常處理程序xlanchen@2007.9.2727LinuxOperatingSystemAnalysis故障非屏蔽中斷陷阱,斷點調試陷阱故障,缺頁異常中止異常處理程序異常處理程序發(fā)出的信號xlanchen@2007.9.2728LinuxOperatingSystemAnalysis中斷描述符表(InterruptDescriptorTable,IDT)中斷描述符表是一個系統(tǒng)表,它與每一個中斷或者異常向量相聯系每個向量在表中有相應的中斷或者異常處理程序的入口地址。每個描述符8個字節(jié),共256項,占用空間2KB內核在允許中斷發(fā)生前,必須適當的初始化IDTCPU的idtr寄存器指向IDT表的物理基地址lidt指令xlanchen@2007.9.2729LinuxOperatingSystemAnalysisIDT包含3種類型的描述符任務門:Linux沒有使用任務門中斷門:指定中斷處理程序,進入中斷門時,系統(tǒng)進入關中斷狀態(tài)陷阱門:與中斷門類似,但進入陷阱門時,系統(tǒng)不會進入關中斷狀態(tài)xlanchen@2007.9.2730LinuxOperatingSystemAnalysis中斷和異常的硬件處理
進入中斷/異常假定:內核已經初始化,CPU在保護模式下運行CPU的正常運行:當執(zhí)行了一條指令后,cs和eip這對寄存器包含了下一條將要執(zhí)行的指令的邏輯地址。在執(zhí)行這條指令之前,CPU控制單元會檢查在運行前一條指令時是否發(fā)生了一個中斷或者異常。如果發(fā)生了一個中斷或異常,那么CPU控制單元執(zhí)行下列操作:xlanchen@2007.9.2731LinuxOperatingSystemAnalysis1,確定與中斷或者異常關聯的向量i(0~255)2,讀idtr寄存器指向的IDT表中的第i項3,從gdtr寄存器獲得GDT的基地址,并在GDT中查找,以讀取IDT表項中的段選擇符所標識的段描述符。4,確定中斷是由授權的發(fā)生源發(fā)出的。中斷:中斷處理程序的特權不能低于引起中斷的程序的特權(對應GDT表項中的DPLvsCS寄存器中的CPL)編程異常:還需比較CPL與對應IDT表項中的DPL這個描述符指定中斷或異常處理程序所在段的基地址只允許從低特權級“陷入”到高特權級,反之不可以禁止低特權級用戶訪問特殊的門xlanchen@2007.9.2732LinuxOperatingSystemAnalysis5,檢查是否發(fā)生了特權級的變化,一般指是否由用戶態(tài)陷入了內核態(tài)。
如果是由用戶態(tài)陷入了內核態(tài),控制單元必須開始使用與新的特權級相關的堆棧a,讀tr寄存器,訪問運行進程的tss段b,用與新特權級相關的棧段和棧指針裝載ss和esp寄存器。這些值可以在進程的tss段中找到c,在新的棧中保存ss和esp以前的值,這些值指明了與舊特權級相關的棧的邏輯地址xlanchen@2007.9.2733LinuxOperatingSystemAnalysis6,若發(fā)生的是故障,用引起異常的指令地址修改cs和eip寄存器的值,以使得這條指令在異常處理結束后能被再次執(zhí)行7,在棧中保存eflags、cs和eip的內容8,如果異常產生一個硬件出錯碼,則將它保存在棧中9,裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量字段。這對寄存器值給出中斷或者異常處理程序的第一條指定的邏輯地址xlanchen@2007.9.2734LinuxOperatingSystemAnalysis此時的進程內核態(tài)堆棧(注意此進程可以是任意一個進程,中斷處理程序不關心這個)ssespeflagscseip8KBunionesp進程描述符用戶態(tài)進程上下文和前次中斷保存ss,esp,eflags,cs和eipeflagscseip進程描述符esp從內核態(tài)進入中斷/異常從用戶態(tài)進入中斷/異常Errorcodeespxlanchen@2007.9.2735LinuxOperatingSystemAnalysis從中斷/異常返回中斷/異常處理完后,相應的處理程序會執(zhí)行一條iret匯編指令,這條匯編指令讓CPU控制單元做如下事情:1,用保存在棧中的值裝載cs、eip和eflags寄存器。如果一個硬件出錯碼曾被壓入棧中,那么彈出這個硬件出錯碼2,檢查處理程序的特權級是否等于cs中最低兩位的值(這意味著進程在被中斷的時候是運行在內核態(tài)還是用戶態(tài))。若是,iret終止執(zhí)行;否則,轉入3xlanchen@2007.9.2736LinuxOperatingSystemAnalysis3,從棧中裝載ss和esp寄存器。這步意味著返回到與舊特權級相關的棧4,檢查ds、es、fs和gs段寄存器的內容,如果其中一個寄存器包含的選擇符是一個段描述符,并且特權級比當前特權級高,則清除相應的寄存器。這么做是防止懷有惡意的用戶程序利用這些寄存器訪問內核空間xlanchen@2007.9.2737LinuxOperatingSystemAnalysis中斷和異常處理程序的嵌套執(zhí)行當內核處理一個中斷或異常時,就開始了一個新的內核控制路徑當CPU正在執(zhí)行一個與中斷相關的內核控制路徑時,linux不允許進程切換。不過,一個中斷處理程序可以被另外一個中斷處理程序中斷,這就是中斷的嵌套執(zhí)行xlanchen@2007.9.2738LinuxOperatingSystemAnalysis搶占原則普通進程可以被中斷或異常處理程序打斷異常處理程序可以被中斷程序打斷中斷程序只可能被其他的中斷程序打斷Linux允許中斷嵌套的原因提高可編程中斷控制器和設備控制器的吞吐量實現了一種沒有優(yōu)先級的中斷模型xlanchen@2007.9.2739LinuxOperatingSystemAnalysis初始化中斷描述符表內核啟動中斷前,必須初始化IDT,然后把IDT的基地址裝載到idtr寄存器中int指令允許用戶進程發(fā)出一個中斷信號,其值可以是0-255的任意一個向量。 所以,為了防止用戶用int指令非法模擬中斷和異常,IDT的初始化時要很小心的設置特權級然而用戶進程有時必須要能發(fā)出一個編程異常。為了做到這一點,只要把相應的中斷或陷阱門描述符的特權級設置成3xlanchen@2007.9.2740LinuxOperatingSystemAnalysis初始化中斷描述符表Linux中的中斷門、陷阱門和系統(tǒng)門定義中斷門用戶態(tài)的進程不能訪問的一個Intel中斷門(特權級為0),所有的中斷都通過中斷門激活,并全部在內核態(tài)系統(tǒng)門用戶態(tài)的進程可以訪問的一個Intel陷阱門(特權級為3),通過系統(tǒng)門來激活4個linux異常處理程序,它們的向量是3,4,5和128。因此,在用戶態(tài)下可以發(fā)布int3,into,bound和int$0x80四條匯編指令陷阱門用戶態(tài)的進程不能訪問的一個Intel陷阱門(特權級為0),大部分linux異常處理程序通過陷阱門激活xlanchen@2007.9.2741LinuxOperatingSystemAnalysis初始化中斷描述符表下列體系結構相關的函數用來在IDT中設置門不同的是系統(tǒng)門中特權級對應的位DPL被置成3。三個函數都把相應的門中的段描述符設置成內核代碼段的選擇符,偏移字段設置成addr。xlanchen@2007.9.2742LinuxOperatingSystemAnalysisxlanchen@2007.9.2743LinuxOperatingSystemAnalysisIDT的初步初始化(head.S)用ignore_int()函數填充256個idt_table表項xlanchen@2007.9.2744LinuxOperatingSystemAnalysisxlanchen@2007.9.2745LinuxOperatingSystemAnalysisStart_kernel中的IDT表初始化xlanchen@2007.9.2746LinuxOperatingSystemAnalysisTrap_init系統(tǒng)調用20個異常源文件xlanchen@2007.9.2747LinuxOperatingSystemAnalysisInit_IRQ中斷源文件xlanchen@2007.9.2748LinuxOperatingSystemAnalysis異常處理CPU產生的大部分異常都由linux解釋為出錯條件。
當一個異常發(fā)生時,內核就向引起異常的進程發(fā)送一個信號通知它發(fā)生了一個反常條件異常處理有一個標準的結構,由三部分組成在內核態(tài)堆棧中保存大多數寄存器的內容調用C語言的函數通過ret_from_exception()從異常處理程序退出觀察entry.S,并找到C語言函數的定義之處xlanchen@2007.9.2749LinuxOperatingSystemAnalysis此處,去調用相應的C語言編寫的處理函數pt_regs指針出錯碼xlanchen@2007.9.2750LinuxOperatingSystemAnalysis此時的內核態(tài)堆棧ssespeflagcseiporig_eax:0esdseaxebpediesiedxecxebxerror_codePointer返回地址硬件自動保存error_code代碼手工壓入esp高地址低地址進程描述符pt_regs指針Errorc_ode拷貝完后,被設為-1用于傳遞Errorc_odexlanchen@2007.9.2751LinuxOperatingSystemAnalysispt_regs結構(恢復現場所需的上下文)棧底(高地址)棧頂(低地址)xlanchen@2007.9.2752LinuxOperatingSystemAnalysis異常處理當C函數終止時,根據堆棧中的返回地址,CPU從call*%edi這條指令的下一條指令開始繼續(xù)執(zhí)行,即:addl$8,%espjmp
ret_from_exceptionaddl$8,%esp的意思是堆棧指針+8,即彈出了pointer和error_code,此時堆棧中內容為ssespeflagcseiporgi_eax(-1)esdseaxebpediesiedxecxebxerror_codePointer返回地址硬件自動保存將由iret指令負責彈出前面的匯編手工壓入,將由restore_all負責彈出esp進程描述符xlanchen@2007.9.2753LinuxOperatingSystemAnalysis中斷處理中斷跟異常不同,它并不是表示程序出錯, 而是硬件設備有所動作,所以不是簡單地往當前進程發(fā)送一個信號就OK的主要有三種類型的中斷:I/O設備發(fā)出中斷請求時鐘中斷處理器間中斷(在SMP,SymmetricMultiprocessor上才會有這種中斷)xlanchen@2007.9.2754LinuxOperatingSystemAnalysisI/O中斷處理I/O中斷處理程序必須足夠靈活以給多個設備同時提供服務比如幾個設備可以共享同一個IRQ線
(2個8359級聯也只能提供15根IRQ線,所以外設共享IRQ線是很正常的)
這就意味著僅僅中斷向量解決不了全部問題xlanchen@2007.9.2755LinuxOperatingSystemAnalysis靈活性以兩種不同的方式達到IRQ共享:
中斷處理程序執(zhí)行多個中斷服務例程(interruptserviceroutines,ISRs)。每個ISR是一個與單獨設備(共享IRQ線)相關的函數IRQ動態(tài)分配:一條IRQ線在可能的最后時刻才與一個設備相關聯xlanchen@2007.9.2756LinuxOperatingSystemAnalysis為了保證系統(tǒng)對外部的響應,一個中斷處理程序必須被盡快的完成。因此,把所有的操作都放在中斷處理程序中并不合適Linux中把緊隨中斷要執(zhí)行的操作分為三類緊急的(critical)
一般關中斷運行。諸如對PIC應答中斷,對PIC或是硬件控制器重新編程,或者修改由設備和處理器同時訪問的數據xlanchen@2007.9.2757LinuxOperatingSystemAnalysis非緊急的(noncritical)
如修改那些只有處理器才會訪問的數據結構(例如按下一個鍵后讀掃描碼),這些也要很快完成,因此由中斷處理程序立即執(zhí)行,不過一般在開中斷的情況下xlanchen@2007.9.2758LinuxOperatingSystemAnalysis非緊急可延遲的(noncriticaldeferrable)
如把緩沖區(qū)內容拷貝到某個進程的地址空間(例如把鍵盤緩沖區(qū)內容發(fā)送到終端處理程序進程)。這些操作可以被延遲較長的時間間隔而不影響內核操作,有興趣的進程將會等待數據。內核用下半部分這樣一個機制來在一個更為合適的時機用獨立的函數來執(zhí)行這些操作xlanchen@2007.9.2759LinuxOperatingSystemAnalysis不管引起中斷的設備是什么,所有的I/O中斷處理程序都執(zhí)行四個相同的基本操作1,在內核態(tài)堆棧保存IRQ的值和寄存器的內容2,為正在給IRQ線服務的PIC發(fā)送一個應答,這將允許PIC進一步發(fā)出中斷3,執(zhí)行共享這個IRQ的所有設備的中斷服務例程4,跳到ret_from_intr()的地址xlanchen@2007.9.2760LinuxOperatingSystemAnalysis中斷處理示意圖xlanchen@2007.9.2761LinuxOperatingSystemAnalysisLinux中的中斷向量分配表xlanchen@2007.9.2762LinuxOperatingSystemAnalysisLinux中的設備中斷IRQ號與I/O設備之間的對應關系是在初始化每個設備驅動程序時建立的xlanchen@2007.9.2763LinuxOperatingSystemAnalysis中斷處理系統(tǒng)初始化時,調用init_IRQ()函數用新的中斷門替換臨時中斷門來更新IDT
這段代碼在interrupt數組中找到用于建立中斷門的中斷處理程序地址。xlanchen@2007.9.2764LinuxOperatingSystemAnalysisInterrupt數組的定義Linux中Interrupt數組的定義比較隱晦源文件xlanchen@2007.9.2765LinuxOperatingSystemAnalysis每個中斷程序入口的定義源文件源文件xlanchen@2007.9.2766LinuxOperatingSystemAnalysis因此,每個中斷程序入口操作為:將中斷向量入棧保存所有其他寄存器調用do_IRQ跳轉到ret_from_intrxlanchen@2007.9.2767LinuxOperatingSystemAnalysisdo_IRQdo_IRQ使用的數據結構(體系結構無關):irq_desc數組包含了NR_IRQS(通常為224)個irq_desc_t描述符xlanchen@2007.9.2768LinuxOperatingSystemAnalysisirq_desc_t和irq_desc每一個中斷號具有一個描述符,使用action鏈表連接共享同一個中斷號的多個設備和中斷中斷控制器處理例程xlanchen@2007.9.2769LinuxOperatingSystemAnalysisirqaction數據結構用來實現IRQ的共享,維護共享irq的特定設備和特定中斷,所有共享一個irq的鏈接在一個action表中,由中斷描述符中的action指針指向鏈表中斷處理程序xlanchen@2007.9.2770LinuxOperatingSystemAnalysis設置irqaction的函數…xlanchen@2007.9.2771LinuxOperatingSystemAnalysishw_interrupt_type數據結構為特定PIC編寫的低級I/O例程xlanchen@2007.9.2772LinuxOperatingSystemAnalysis8259A的hw_interrupt_type8259A的中斷控制操作所有連接到8259A的外設中斷都要設置xlanchen@2007.9.2773LinuxOperatingSystemAnalysis例如:xlanchen@2007.9.2774LinuxOperatingSystemAnalysis中斷處理過程在調用do_IRQ之前,要為中斷處理程序保存寄存器在interrupt數組中定義的中斷處理程序中每個入口地址轉換成匯編碼是如下的一些指令
IRQn_interrupt:
pushl$n-256
jmp
common_interrupt
這里對所有的中斷處理程序都執(zhí)行相同的代碼
common_interrupt: SAVE_ALL calldo_IRQ
jmp$ret_from_intrxlanchen@2007.9.2775LinuxOperatingSystemAnalysisssespeflagcseip$n-256esdseaxebpediesiedxecxebx返回地址Pointer硬件自動保存SAVE_ALLesp進程描述符do_IRQ執(zhí)行時內核態(tài)的堆棧do_IRQ()的函數聲明從do_IRQ返回后要執(zhí)行的指令地址ret_from_intrxlanchen@2007.9.2776LinuxOperatingSystemAnalysis中斷處理do_IRQ()函數的等價代碼:
int
irq=regs.orig_eax&0xff; //1
irq_desc[irq].handler->ack(irq); //2 handle_IRQ_event(irq,®s,irq_desc[irq].action);//3
irq_desc[irq].handler->end(irq); //4
處理下半部分 //5 1句將$n-255轉換成n,取得對應的中斷向量
2句應答PIC的中斷,并禁用這條IRQ線。(為串行處理同類型中斷) 3句調用handle_IRQ_event()執(zhí)行中斷服務例程
4句通知PIC重新激活這條IRQ線,允許處理同類型中斷xlanchen@2007.9.2777LinuxOperatingSystemAnalysis中斷服務例程一個中斷服務例程實現一種特定設備的操作,handle_IRQ_evnet()函數依次調用這些設備例程這個函數本質上執(zhí)行了如下核心代碼: do{
action->handler(irq,action->dev_id,regs);
action=action->next;
}while(action)xlanchen@2007.9.2778LinuxOperatingSystemAnalysis軟中斷、tasklet以及下半部分對內核來講,可延遲中斷不是很緊急,可以將它們從中斷處理例程中抽取出來,保證較短的中斷響應時間Linux2.4提供了三種方法軟中斷、tasklet以及下半部分Tasklet在軟中斷之上實現下半部分通過tasklet實現一般原則:在同一個CPU上軟中斷/tasklet/下半部分不嵌套軟中斷和下半部分由內核靜態(tài)分配(編譯時確定)Tasklet可以在運行時分配和初始化(例如裝入一個內核模塊時)xlanchen@2007.9.2779LinuxOperatingSystemAnalysis一般而言,可延遲函數上可以執(zhí)行4種操作初始化:定義一個新的可延遲函數,通常在內核初始化時進行激活:設置可延遲函數在下一輪處理中執(zhí)行屏蔽:有選擇的屏蔽一個可延遲函數,這樣即使被激活也不會被運行執(zhí)行:在特定的時間執(zhí)行可延遲函數xlanchen@2007.9.2780LinuxOperatingSystemAnalysis軟中斷Linux2.4使用有限個軟中斷,目前只有4個在softirq_vec中定義優(yōu)先級0:處理高優(yōu)先級的tasklet和下半部分優(yōu)先級1:把數據包傳送到網卡優(yōu)先級2:從網卡接受數據包優(yōu)先級3:處理tasklet優(yōu)先級對應于softirq_vec的下標軟中斷函數及其參數xlanchen@2007.9.2781LinuxOperatingSystemAnalysis軟中斷的初始化初始化軟中斷函數分別在softirq_init和net_dev_init中初始化xlanchen@2007.9.2782LinuxOperatingSystemAnalysis內核中用來控制軟中斷的數據結構irq_statirq_stat數組用來描述各個CPU的irq處理狀態(tài)對于單CPU而言,數組長度為1哪些軟中斷被掛起禁止軟中斷?哪個進程執(zhí)行可延遲函數?對這個數據的調控,用來激活一個軟中斷:__cpu_raise_softirqcpu_raise_softirq還可能喚醒這個進程ksoftirqdxlanchen@2007.9.2783LinuxOperatingSystemAnalysis軟中斷的檢查在某些特定的時機,會檢查是否有軟中斷被掛起調用local_bh_enable重新激活軟中斷時當do_IRQ完成了I/O中斷的處理時當那個特定的進程ksoftirqd被喚醒時…這種時機,稱為檢查點xlanchen@2007.9.2784LinuxOperatingSystemAnalysis在每個檢查點若有軟中斷被掛起,就調用do_softirq判斷是否可以執(zhí)行軟中斷若可以,就執(zhí)行軟中斷執(zhí)行后,若發(fā)現又有新的軟中斷被激活,就喚醒ksoftirqd進程,來觸發(fā)do_softirq的另一次執(zhí)行xlanchen@2007.9.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學生慶十一國慶節(jié)征文(5篇)
- 萬能的年終工作總結范文(十篇)
- 產科醫(yī)師年度工作總結范文
- 企業(yè)會計人員工作總結范文(10篇)
- 安徽省淮北市和淮南市2025屆高三第一次質量檢測思想政治試卷(含答案)
- 我心中的陽光5篇
- 公眾號推廣合作合同(2篇)
- 混凝土罐車車租賃合同
- 寫字樓買賣租賃合同
- 批發(fā)市場攤位租賃協(xié)議
- GB/T 20154-2014低溫保存箱
- 固定資產報廢管理制度管理辦法
- 深基坑開挖及支護施工方案-經專家論證
- 排水管渠及附屬構筑物
- 養(yǎng)豬場施工噪聲環(huán)境影響分析
- Windows-Server-2012網絡服務架構課件(完整版)
- 形位公差_很詳細(基礎教育)
- 手榴彈使用教案
- 600MW機組除氧器水位控制系統(tǒng)
- 史上最全的涉稅風險
- 初中數學問題情境的創(chuàng)設
評論
0/150
提交評論