《深入理解LINUX核心》筆記(四)

2021-07-30 14:27:04 字數 1601 閱讀 3035

每個能夠發出中斷請求的硬體裝置控制器都有一條名為

irq(

iinterpretrequest)的輸出線

80x86微處理器大約發布了約

20種不同的異常,核心必須位每種異常提供一種專門的異常處理程式

對某些異常,

cpu控制單元會在執行異常處理程式前產生乙個硬體出錯碼(

hardwareerror code),並且壓入核心態堆疊

中斷描述符表(

itterruptdescriptortable,idt)是乙個系統表,它與每乙個中斷或者異常向量相聯絡,每乙個向量在表中都有相應的中斷或異常處理程式的入口位址

linux利用中斷門處理中斷,利用陷阱門處理異常

核心啟用中斷以前,必須把

idt表的初始位址裝到

itdr暫存器,並初始化表中的每一項

異常處理程式和宗有乙個標準的結構,由

3部分:

1.在核心態堆疊中儲存大多數暫存器的內容(這部分用組合語言實現)

2.用高階的

c函式處理異常

3.通過

ret_from_exception()函式從異常處理程式退出

中斷型別

li/o中斷、時鐘中斷、處理器間中斷

自旋鎖保護不同

cpu的併發訪問

第五章核心同步

搶占核心的主要優點是:乙個在核心態執行的程序可能在執行乙個函式期間被另乙個程序取代

只有當核心正在處理異常處理程式(尤其系統呼叫),而且核心搶占沒有被顯式的禁用時,才可能搶占核心。此外,本地

cpu必須開啟本地中斷

只有在開中斷的情況下,才可能傳送核心控制路徑的巢狀

通過在訪問共享資料結構時金庸核心搶占功能實現臨界區

中斷處理程式、軟中斷和

tasklet既不可以被搶占也不能被阻塞,所以不能長時間處於掛起狀態

軟中斷和

tasklet不能在以份額

cpu上交錯執行

同乙個tasklet不能同時在幾個

cpu紅色那個執行

核心使用的各種同步技術說明

每cpu變數(

pre-cpu variable) 在

cpu之間複製資料結構

原子操作

對乙個計數器原子的「讀

-修改-寫」的指令

記憶體屏障

避免指令重新排序

自旋鎖加鎖時

訊號量加鎖時阻塞等待(睡眠)

順序鎖基於訪問計數器的鎖

本地中斷的禁止

禁止單個

cpu上的中斷處理

本地軟中斷的禁止

禁止單個

cpu上的可延遲函式處理 讀

-拷貝-更新(

rcu)

通過指標而不是鎖來訪問資料結構 ,每

cpu變數主要時資料結構的陣列,每個

cpu對應陣列的乙個元素。

核心控制路徑應該在禁用搶占的情況下訪問

cpu變數

組合語言指令訪問儲存單元兩次,第一次讀原值,第二次寫新值

在串處理系統中,永遠都不會發生記憶體匯流排竊用的情況

指令不一定按源**順序執行,編譯器可能會以使暫存器最優的方式重新安排彙編指令

所有的同步原語起優化和記憶體屏障的作用

深入理解Linux核心 筆記

第一章 緒論 1.unix檔案可以是下列型別之一 a.正規檔案 regular file b.目錄 directroy c.符號鏈 symbolic link d.塊裝置檔案 block oriented device file e.字元裝置檔案 charactor oriented device ...

《深入理解LINUX核心》筆記(五)

一種廣泛應用的同步技術就是加鎖 locking 當核心控制路徑必須訪問共享資料結構或進入臨界區時,就需要獲取 鎖 自旋鎖 spinlock 是用來在一種多處理器環境中工作的一種特殊的鎖 在單處理器系統上,這種鎖本身並不起鎖的作用,自旋鎖原語僅僅是禁止或啟用核心搶占 讀 寫自旋鎖的引入是為了增加核心的...

深入理解Linux核心 核心同步

核心基本的同步機制 搶占核心的主要特點 乙個在核心態執行的程序,可能在執行核心函式期間被另外乙個程序取代。核心搶占 linux 2.6允許使用者在編譯核心的時候配置十分啟用 程序臨界區 每個程序中訪問臨界資源 一次僅允許乙個程序使用的共享資源 的那段 稱為臨界區。優化屏障 保證編譯程式不會混淆放在原...