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