Linux核心開發學習筆記(二)

2021-10-09 08:47:41 字數 1915 閱讀 3107

(1)段機制(段描述符表(段表))

段描述符表:由段號,基位址,界限,屬性組成。

其中,線性位址=段的起始位址+偏移量(由於linux核心以分頁機制為主,因此,linux將段的起始位址設定為0,則保留了段機制,但實際使用了分頁機制)

(2)分頁機制

(3)**除錯(1)概述

呼叫fork系統呼叫建立程序,使用ps -ejh命令檢視程序的家族關係。

linux核心中程序的描述結構體:task_struct,主要包含了:狀態資訊(程序動態轉換);親屬資訊(父子關係);識別符號(表示不同程序);程序間的通訊關係;時間和定時器資訊(cpu生命週期相關資訊);排程資訊(程序優先順序和排程策略);檔案系統資訊(記錄程序使用檔案系統情況);虛擬記憶體資訊(描述程序擁有的位址空間);處理器環境資訊(程序的執行環境,例如暫存器、堆疊)

linux程序狀態及轉換關係圖

該圖**於網路

程序的描述結構體:存放於核心棧的堆疊暫存器,作為資料結構thread_info的第乙個字段,占用8kb記憶體。優點:(1)可用過核心棧指標,快速得到描述結構體的起始位址;(2)避免建立程序時動態分配額外的記憶體。

(linux為表示當前正在執行的程序,定義了乙個current巨集,可獲得程序的相關資訊)

(2)程序建立

linux中將程序、執行緒、核心執行緒等均使用task_struct結構體表示,在核心中均通過do_fork()分別建立。

do_fork()**執行流程

(1)呼叫copy_process()複製父程序的程序描述結構體;

(2)確定子程序的pid;

(3)根據clone_stopped標誌位,阻塞程序 or 置為就緒態,並壓入就緒佇列;

(4)採用vfork()建立程序,會阻塞父程序(因為vfork不會複製父程序的資源,而是共享父程序的記憶體,因此為了保證多程序的安全性,子程序先執行)。

copy_process()**執行流程:(為子程序建立父程序的程序描述結構體的副本)

(1)檢查標誌變數合法性;

(2)dup_task_struct();

(3)檢查資源限制;

(4)初始化task_struct中的字段;

(5)sched_fork();

(6)複製或共享父程序的資源

(7)設定pid,程序關係等。

程序的生命週期:exec()、exit()、wait()

(3)程序排程

基本的排程模型

執行緒排程的構成:就緒佇列(場所)、排程演算法(核心)、程序的切換(操作)、時鐘中斷(驅動力,ps:針對cpu時間片的排程方式)

就緒佇列:雙向迴圈鍊錶

排程演算法

效能需求:(1)對於分時程序,採用公平排程;(2)快速的程序響應時間;(3)高吞吐量;(4)功耗低。

Linux核心list head學習筆記(二)

注 這個list.h 是為了配合示例程式而建的,內容來自 linux include linux list.h 和相關檔案 ifndef linux list h define linux list h struct list head define list head init name defi...

Linux核心 驅動學習筆記 二

linux是如何管理記憶體的?今天系統的整理一下這個問題。在系統的初始化階段,核心根據檢測到的物理記憶體的大小,為每乙個頁面都建立乙個page結構,形成乙個page結構的陣列,並使乙個全域性量mem map指向這個陣列。同時又按需要將這些頁面拼合成許多記憶體頁面塊,再把塊組成管理區zone,分配和釋...

Linux核心學習筆記 核心同步

linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...