linux核心介紹
linux核心介紹
https://blog.csdn.net/u012489236/article/list/3?t=1
核心體系結構
https://www.cnblogs.com/luxiaodai/p/13379737.html
Linux核心主要由五個子系統組成:程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。
-
程序排程(SCHED):控制程序對CPU的訪問。當需要選擇下一個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待CPU資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。Linux使用了比較簡單的基於優先順序的程序排程演算法選擇新的程序。
-
記憶體管理(memory management,MM)允許多個程序安全的共享主記憶體區域。Linux 的記憶體管理支援虛擬記憶體,即在計算機中執行的程式,其程式碼,資料,堆疊的總量可以超過實際記憶體的大小,作業系統只是把當前使用的程式塊保留在記憶體中,其餘的程式塊則保留在磁碟中。必要時,作業系統負責在磁碟和記憶體間交換程式塊。記憶體管理從邏輯上分為硬體無關部分和硬體有關部分。硬體無關部分提供了程序的對映和邏輯記憶體的對換;硬體相關的部分為記憶體管理硬體提供了虛擬介面。
-
虛擬檔案系統(Virtual File System,VFS)隱藏了各種硬體的具體細節,為所有的裝置提供了統一的介面,VFS提供了多達數十種不同的檔案系統。虛擬檔案系統可以分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指Linux所支援的檔案系統,如ext2,fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。
-
網路介面(NET)提供了對各種網路標準的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。網路裝置驅動程式負責與硬體裝置通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。
-
程序間通訊(inter-process communication,IPC) 支援程序間各種通訊機制。
處於中心位置的程序排程,所有其它的子系統都依賴它,因為每個子系統都需要掛起或恢復程序。一般情況下,當一個程序等待硬體操作完成時,它被掛起;當操作真正完成時,程序被恢復執行。例如,當一個程序通過網路傳送一條訊息時,網路介面需要掛起傳送程序,直到硬體成功成功地完成訊息的傳送,當訊息被成功的傳送出去以後,網路介面給程序返回一個程式碼,表示操作的成功或失敗。其他子系統以相似的理由依賴於程序排程。
各個子系統之間的依賴關係如下:
程序排程與記憶體管理之間的關係:這兩個子系統互相依賴。在多道程式環境下,程式要執行必須為之建立程序,而建立程序的第一件事情,就是將程式和資料裝入記憶體。
程序間通訊與記憶體管理的關係:程序間通訊子系統要依賴記憶體管理支援共享記憶體通訊機制,這種機制允許兩個程序除了擁有自己的私有空間,還可以存取共同的記憶體區域。
虛擬檔案系統與網路介面之間的關係:虛擬檔案系統利用網路介面支援網路檔案系統(NFS),也利用記憶體管理支援RAMDISK裝置。
記憶體管理與虛擬檔案系統之間的關係:記憶體管理利用虛擬檔案系統支援交換,交換程序(swapd)定期由排程程式排程,這也是記憶體管理依賴於程序排程的唯一原因。當一個程序存取的記憶體對映被換出時,記憶體管理向檔案系統發出請求,同時,掛起當前正在執行的程序。
除了這些依賴關係外,核心中的所有子系統還要依賴於一些共同的資源。這些資源包括所有子系統都用到的過程。例如:分配和釋放記憶體空間的過程,列印警告或錯誤資訊的過程,還有系統的除錯例程等等。
linux中斷機制
- 硬體的中斷響應 ---> 核心驅動中的中斷
- 系統呼叫的函式響應(sys_call) ---> 系統呼叫
- 自定義中斷 ---> 軟體的中斷模式
- 訊號中斷 ---> 對了解訊號的使用、建立等
- 系統的異常和錯誤 ---> 系統的異常獲取,瞭解系統異常的作用
linux中斷機制
https://blog.csdn.net/xiaoshengqdlg/article/details/39296937
硬中斷
由與系統相連的外設(比如網絡卡、硬碟)自動產生的。主要是用來通知作業系統系統外設狀態的變化。比如當網絡卡收到資料包 的時候,就會發出一箇中斷。我們通常所說的中斷指的是硬中斷(hardirq);硬中斷的本質是接收到中斷訊號後,跳轉到公共段程式碼執行do_IRQ,並切換到硬中斷請求棧,執行中斷回撥函式。
軟中斷
為了滿足實時系統的要求,中斷處理應該是越快越好。linux為了實現這個特點,當中斷髮生的時候,硬中斷處理那些短時間
-
軟中斷通過open_softirq註冊一個軟中斷處理函式,即在軟中斷向量表softirq_vec陣列中新增新的軟中斷處理action函式。
-
呼叫raised_softirq軟中斷觸發函式,即把軟中斷標記為掛起狀態。核心會在一些位置檢查是否有掛起狀態的軟中斷,如果有的話會呼叫do_softirq函式來執行軟中斷處理函式。
-
do_softirq函式做的一個重要的工作是切換到軟中斷請求棧。切換到軟中斷請求棧就代表了此時已經處於了軟中斷上下文中了。
- 切換到軟中斷請求棧
- 呼叫__do_softirq函式
- __do_softirq函式
-
開始執行軟中斷處理函式
-
如果還有更多掛起的軟中斷沒有處理,則呼叫wakeup_softirq函式喚醒核心執行緒來處理本地CPU的軟中斷。該執行緒會迴圈呼叫do_softirq函式而不是在核心那些檢查軟中斷是否掛起的位置進行檢查,節省了時間。
中斷處理流程
https://www.cnblogs.com/embedded-linux/p/5888843.html
- 將所有的暫存器入棧:SS EFLAGS ESP CS EIP (8086) <---> R0 - R15 (ARM)
- 將異常碼(中斷號)入棧
- 將當前的函式返回值入棧(為了在中斷執行後能夠找到在哪裡中斷的,能夠返回原先函式執行的位置)
- 呼叫對應的中斷服務函式
- 出棧函式返回值
- 出棧所有的入棧的暫存器 (中斷號丟棄了)
中斷前的處理過程和中斷後的回覆過程 | 中斷的執行過程 | |
---|---|---|
硬體中斷的處理過程 | system_call.s | trap.c |
軟體及系統呼叫的處理過程 | system_call.s | fork.c/signal.c/exit.c/sys.c |
中斷的程式碼實現
-
硬體中斷
system_call.s解讀:https://blog.csdn.net/weixin_32512187/article/details/116818186