Linux核心 驅動學習筆記 一

2021-04-13 02:10:17 字數 1159 閱讀 8801

今天討論到核心啟動階段對外部裝置初始化的過程,於是粗略的看了一下相關**,得到以下一些印象(未必正確,希望大家指正):

1.對外部裝置初始化**出現的地方應該是

init()程序(

bootloader->start

彙編->decompress->start_kernel()->rest_init()->kernel_thread()->init() )

2.init()

裡的do_basic_setup()

,do_basic_setup()

呼叫driver_init()

和do_initcalls()

3.driver_init()

初始化各種外部裝置、匯流排等的

kobject

結構 4.do_initcalls()

用result = (*call)();

這句**在

for迴圈中去呼叫

.initcall.init

節中的各個驅動初始化函式指標去執行初始化。在

arch/***/vmlinux.lds

中會有對

__initcall_start

和__initcall_end

的定義。

5.驅動程式初始化**中會有

probe

函式去探測裝置。

程序描述符:task_struct  該結構由叫做任務佇列(task list)的雙向迴圈鍊錶管理,該結構包含核心管理乙個程序所需的所有資訊(程序開啟的檔案、程序的位址空間、掛起的訊號、程序的狀態等等),linux通過slab分配器分配task_struct結構。

寫時拷貝:fork時並不複製整個程序位址空間,而是讓父程序與子程序共享乙個拷貝,只有在需要寫入的時候,資料才會被複製,這使得位址空間上頁的拷貝被推遲到實際發生寫入的時候。比如說fork後直接呼叫exec,那麼就無需複製了。

fork( ):

fork->clone->do_fork->copy_process

和wake_up_new_task

執行緒在linux上的實現:從核心的角度來說,linux沒有執行緒這個概念,它把所有執行緒都當作程序處理,執行緒僅僅被視為乙個與其他程序共享某些資源的程序,每個執行緒都擁有唯一隸屬於自己的task_struct。建立執行緒時通過clone( )傳遞的標誌位來指明需要共享的資源。

Linux核心 驅動學習筆記 二

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

linux驅動學習筆記(一)

1.linux下的c程式設計特點 if forwhile switch語句,不另起一行 if和for只有一行 不要使用 對於函式需要另起一行使用 2.switch case 語句switch 與 case 對齊使用 3.核心模組的載入,解除安裝,顯示命令 insmod 載入核心模組 rmmod 解除...

Linux核心驅動模組學習

ko檔案在是elf excutable and link format 格式,是一種可重定位的目標檔案。在編譯驅動模組時,我們在makefile中用obj m o來指定生成核心驅動模組檔案,即.ko檔案。首先insmod會通過檔案系統將ko讀到使用者空間的一塊記憶體中,然後執行系統呼叫sys ini...