Linux中断处理与定时器
中斷是現代操作系統中的重要功能之一。中斷與硬件系統結合緊密,同時又對上層提供了良好的界面,是控制硬件相關的操作的重要手段。所以,在現代所有操作系統的編寫中,都大量使用了中斷處理機制。中斷分兩種,分別是由外部設備生成的硬件中斷(比如鍵盤的敲擊事件)和由軟件程序所產生的軟件中斷(又稱陷阱trap,比如進程所發送的信號時常引起中斷)。Linux中同時支持Intel處理機的外部硬件中斷和內部中斷。
中斷描述符(IDT)是建立在內存中的一個表,它的入口地址存放在一個中斷入口寄存器中。這個表分兩項,第一項是中斷編號,它唯一標識一個中斷;而與之相對應的是一個入口指針,該指針指向內存中相應中斷處理程序的地址。當一個中斷產生時,硬件會先查看處理機的相應中斷允許位是否開放。如果該中斷被允許,則將自動訪問中斷入口寄存器查找IDT的地址,然后訪問IDT并根據中斷號來尋找相應的表項,得到相應的中斷處理程序入口指針,并調用此處理程序;如果該中斷被屏蔽,則將對此中斷視而不見。以上操作都是由硬件自動完成,而操作系統代碼所需要完成的任務只是給出中斷處理程序,并將其入口地址地址填入相應的IDT表項中去。當然,也有某些操作系統中IDT并不是定長的,只有在需要時,才在IDT表中加入一項。
Linux的IDT是定長的,它包含256個中斷表項,即0~255。其中,0~31為Intel公司保留給異常處理程序的,其中斷類型不能更改。在Linux的初始化階段,對中斷入口寄存器、中斷控制器和IDT表進行了一系列初始化工作。
在中斷響應時,為了避免重要操作出現嵌套,從而出現對系統造成破壞的可能行,操作系統規定要關閉中斷允許位,直到中斷處理程序中調用了開中斷指令sti()為止。但是,如果一個中斷的處理時間較長(比如一些硬件中斷,可能會一直等待I/O),則中斷將長時間關閉,這時將會失去對外部發來的其他中斷的響應能力(也就是通常所說的“死機”狀態)。
Linux中為了避免這樣的事情發生,就將那些執行時間可能比較長的中斷處理程序一分為二,稱作top half和bottom half.其中,top half為一些重要的、與硬件設備緊密相關的程序,這些程序一定要關中斷執行,而bottom half中為其余的一些處理程序,這些程序都時對內存進行操作,不怕被打斷。當系統進入中斷處理狀態時,首先關中斷執行top half。top的執行速度一般都很快。在top half結束后,將中斷打開,繼續執行bottom half中的處理程序,這時,新的中斷又可以繼續被截獲。linux中提供了32種bottom half,每種都基本上對應一個設備驅動程序。
由于bottom half只有固定的32種,且其功能不能動態改變,使得她有時不能滿足程序運行的需要。人們由此提出了新的機制,稱作任務隊列。任務隊列基本上同bottom half相同,但它可以動態定義各種處理程序,將任意多個處理函數用隊列的方式串起來,并在適當的時候順序執行。
定時器(timer)時建立在時鐘中斷基礎上的一種Linux定時服務機制。可以設置一個定時器在特定時間發送信號喚醒一個特定的進程。在Linux初始化時,設定8253的定時周期為10ms。由8253產生的時鐘中斷信號直接輸入到第一塊8259A的INT0,即IRQ0中。而IRQ0的中斷處理程序在系統初始化時已經設定為timer_interrupt()調用。在timer_interrupt()調用中。實際上主要執行的是do_timer()調用,該調用設置一個bottom halg,編號為TIMER_BH。關于時鐘的處理程序,主要是在這個bottom half中完成的。
轉載于:https://blog.51cto.com/10495372/1677790
總結
以上是生活随笔為你收集整理的Linux中断处理与定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java不带package和带packa
- 下一篇: CentOS 6.x搭建Open***实