首页 > LinuxDev > some concepts about linux kernel

some concepts about linux kernel

2011年1月10日

来源未知(网络收集),有些内容可能有点陈旧,但看看还是值得的,Linux kerenl面试有时会问下面的一些内容。

Q:HZ是什么?
A:include/asm-386/param.h中#define HZ 100(至少到2.4.18版本如此),是linux中時鐘中斷的頻率,也就是10ms發生一次時鐘中斷.於此相關的變量unsigned long jiffies紀錄了系統從開機到現在所經歷的時鐘中斷週期.

Q:為什么系統在中斷處理程序之前就發送了硬件ack(eoi)?
A:理論上,eoi的作用是告知8259A,CPU對這次中斷的處理已結束.但這裡有個矛盾:假設8259接到一個外設的中斷請求,在CPU進行中斷服務期間,8259的同一個中斷信號線上再次接到中斷請求,該請求將被屏敝(因為CPU沒有發送eoi),由於中斷大多是公用的,這次請求很可能是另外一個外設發出的,這是不合理的.為避免這種情況,Linux盡可能早的發eoi,并靠軟件來避免中斷的重入.具體程序在do_IRQ().

Q:bottom_half是什么?
A:理論上,bottom_half是中斷服務程序的一部分.其主要設計思想是為了避免中斷處理程序較長而造成的長時間關中斷—這意味者後繼中斷信號的丟失.所以把中斷服務程序中對時間要求不嚴格的代碼放在bottom_half中,在開中斷的環境下處理.附帶的一個好處是,幾次中斷的處理可以合併為一次進行.所以linux的時鐘中斷處理程序的主要部分被放在bottom_half中進行.

Q:softirq是什么?
A:可以認為它是bottom_half的擴展,每次進入softirq都要依次處理32個bottom_half對列.值得說明的是目前這32 個對列只用了4個:一個是系統自己帶的bottom_half函數,如timer_bh(),通常我們所說的bottom_half就是指這個對列;一個主要是供driver掛入的;另外2個對列由網絡程序專用;其餘的有待擴充.

Q:中斷發生是不是一定引起任務調度?
A:不一定,得看current->need_resched是不是等於1了.

Q:在do_softirq()一開始為什么用in_interrupt()檢驗是否在中斷中?
A:do_softirq在同一cpu上不能重入.假設在softirq正在運行期間有中斷發生,它會中斷原softirq的執行(如上,softirq的大部分代碼是在開中斷的環境下處理的),當該中斷處理完畢,他也會嘗試啟動新的softirq,這時入口的 in_interrupt()會中止新的softirq執行.

Q:什么是’共享中斷’?
A:由於硬件中斷個數有限,往往不夠用—即便在pci體系上也是如此,所以在軟件實現上,不得不在一個硬件中斷上綑綁幾個不同外設的中斷服務程序.當共享中斷發生,所有被綑綁在該中斷上的服務程序都被執行,也就是說,外設的driver提供的中斷服務程序在一開始就必須自行判斷該中斷是否確實屬於自己.共享中斷會將SA_SHIRQ標誌置位.

Q:什么叫’中斷重入’?
A:cpu在執行中斷處理程序時沒有屏敝中斷,這時第二個中斷發生,該中斷將打斷前一個中斷的處理,如果兩個中斷所走的路徑是重疊的,那 重疊部分的代碼的質量將受到考驗!

Q:什么叫’中斷上下文’?
A:中斷發生前夕的個各register的值,尤其是程序計數器pc和狀態積存器pws的值.與此相似的概念還有’中斷現場’.

Q:local_irq_disable()在smp下究竟是關了所有cpu的中斷還是當前cpu的中斷?
A:local_irq_disable()使用cli禁止中斷:如果你正在處理一個中斷,cli只在當前cpu上禁止中斷,否則,禁止所有cpu上的中斷(這會降底系統性能)。

Q:cisc和risc是什么意思?
A:CISC:它是复雜指令集計算机結构。由于指令系統龐大 ,因此通常不能在一個時鐘周期內執行多條指令。
早期的inter X86是典型的CISC,現在inter已經從支持MMX的p54c、p55c發展到了pentium pro;
RISC:它以优化指令技術保証在一個時鐘周期內可執行多條指令。典型代表有:IBM、APPLE、Motorola聯合開發的PowerPC ,DEC公司開發的Alpha,SUN公司開發的SPARC ,HP公司開發的PA RISC及MIPS公司開發的MIPSR五大系列產品,用于大型机比較多。

Q: 8259A級聯後應該有15個中斷源吧?
A: 對,兩個8259A通過2號中斷(第3個)級聯,在linux代碼中2號中斷被處理為static struct irqaction irq2 = { no_action, 0, 0, “cascade”, NULL, NULL};

Q: 中斷環境中不能用kmalloc動態申請空間?
A:可以, void * kmalloc (size_t size, int flags)
參數size表明要申請的內存大小(以byte為單

位),flags參數表示申請內存的類型,這些類型可以是:
GFP_KERNEL – 申請內存的進程可能被放入等待隊列,也可能被交換到swap分區,但是仍然是使用最為普遍,也是分配到內存的最可靠的方式。
GFP_USER – 用于為用戶分配內存,也可能被放入等待隊列,是优先級很低的一种請求方式。
GFP_ATOMIC – 分配的時候不會被放入等待隊列,如果沒有分配到內存,則立即返回。多用在中斷處理內部。
GFP_DMA – 這個標志表明分配的內存用于DMA。對于不同的平台這有不同的含義,在i386平台上,意味著這些內存必須來自于物理內存的最初16M。
所以必須把flags置為GFP_ATOMIC.

Q: 中斷程序有自己的堆棧、自己的TSS嗎?
A:TSS無從談起,中斷程序使用當前進程的系統堆棧.

Q:中斷的流程.
A: 相應硬件產生中斷–>該硬件發出中斷信號–>該信號傳到cpu中斷引腳(如有必要,先由可編程中斷控制器選优)–>cpu選优 –>發出中斷響應,允許中斷–>系統進入do_irq–>判定中斷向量號–>進行必要處理(共享,獨占……)–>調用中斷處理函數–>處理中斷—>善后
不同体系結构有不同,但大体原理應該一致.

Q:為什么在IDT表中中斷設置從0x20開始?
A:0x20前的向量保留給cpu的硬件中斷 (通常這被稱作’異常’) 使用,比如頁面異常,0除數

本文地址:
http://www.kgdb.info/some-concepts-about-linux-kernel/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

分类: LinuxDev 标签:
本文的评论功能被关闭了.