linux0.11核心中的wait_on_buffer和wait_on_inode函式是非常有代表性的延遲性函式處理過程,網上關於這兩個函式的討論
也很多,最主要的乙個問題是為什麼要在判斷b_lock之前關中斷,這個問題也困擾了我很長時間,查了不少帖子,學到不少東西,但總是
覺得有些細節沒有弄清楚,因此藉著自己實踐開發乙個小os的過程,研究了一下wait_on_buffer,還是學到不少東西的。貼出來,分享
linux0.11版函式定義:
static inline void wait_on_buffer(struct buffer_head * bh)
分析如下:
1. 首先可以明確,wait_on_buffer是工作在核心態的函式。更進一步應當理解為兩種可能性:
或者是當前某個使用者態的程序請求資料進而引發的,那麼可以認為是當前程序進入了核心態;又或者是核心本身的某個任務
引發的操作。不管怎樣wait_on_buffer背後是代表這某個程序或者任務的。
2. wait_on_buffer中通過cli和sti起到乙個保護臨界區的作用,為什麼這麼說?
原因首先還在於wait_on_buffer是工作在核心態的環境下,此時cli就意味著關閉了所有的可遮蔽中斷,如時鐘中斷和硬碟
處理中斷等等,這也就意味著:
1)當前工作在使用者態的程序不會因為時間片到了有可能被輪轉出去,切換成其他的程序,從而保證while(bh->b_lock)形成的
若干條指令中間不會被打斷,造成可能有別的程序修改了bh->b_lock的值,造成錯誤;
2)不會造成硬碟中斷的到來引發的其他程序對bh->b_lock的操作,進而造成錯誤。
因此,通過關閉中斷,可以達到while (bh->b_lock)語句在執行期間被他人修改,從而實現臨界區的效果。
關於這一點,第3版的《understanding the linux kernel》在第五章(核心同步)裡明確也提到,確保一組核心語句被當作
乙個臨界區處理的主要機制之一就是中斷禁止,可惜本人在上學時學的os教材是理論性較強的那種,只關注了各種各樣的臨界操
作模型,沒有提到實現機制,導致很長時間都覺得臨界區的概念很虛,不好掌握。
3. 還有乙個重要的問題就是如果關閉了中斷,那別的使用者程序怎麼辦?是不是整個系統在這段時間內都不能收到相關的中斷訊號
了?這個問題也有很多人問,答案當然是不會影響其他的使用者程序,原因在於sleep_on在將當前程序掛起後,會執行一次程序調
度操作,即schedule(),而一旦選擇了新程序進行切換時,會將新程序的eflags暫存器內容也載入到相應的暫存器的,而這裡當
然包含了if(interrupt flag)位,也就是說如果此時切換過來的程序是使用自己原先的中斷開關狀態的,原來的開就開,原來的關
就關,和之前的程序無關。因此,wait_on_buffer裡對中斷的操作,只影響當時的程序,故這個中斷也被稱為「本地中斷」,這
個稱呼更能反映其實質吧。
Linux wait on buffer函式研究
linux0.11核心中的wait on buffer和wait on inode函式是非常有代表性的延遲性函式處理過程,網上關於這兩個函式的討論 也很多,最主要的乙個問題是為什麼要在判斷b lock之前關中斷,這個問題也困擾了我很長時間,查了不少帖子,學到不少東西,但總是 覺得有些細節沒有弄清楚,...
NGUI UICenterOnChild研究與測試
目錄 一,核心函式解析 二 案例製作 1,最終效果 2,hierarchy 結構 3,部分 三 其它注意事項 本文是基於unity的ngui外掛程式中uicenteronchild.cs指令碼,對其中的核心函式做了解析,並製作了測試案例 1,recenter 重定位最中心位置gameobject 一...
保研 最近參與的保研夏令營
最近忙著保研夏令營的申請,又在做學年設計,都沒有時間更博啦。保研其實也是一場苦仗啊,只是沒有考研那麼慘烈。同樣的要準備複試的專業課知識,把以前快要忘掉的專業課再拿出來看。poj再刷起來。目前報了以下學校 arranged in random order 中科院計算所 x 中科院網路中心 v 中科院軟...