Linux核心驅動模組學習

2021-10-11 01:29:24 字數 1708 閱讀 6154

.ko檔案在是elf(excutable and link format)格式,是一種可重定位的目標檔案。在編譯驅動模組時,我們在makefile中用obj-m=***.o來指定生成核心驅動模組檔案,即.ko檔案。

首先insmod會通過檔案系統將ko讀到使用者空間的一塊記憶體中, 然後執行系統呼叫sys_init_module()解析模組,這時,核心在vmalloc區分配與ko檔案大小相同的記憶體來暫存ko檔案, 暫存好之後解析ko檔案,將檔案中的各個section分配到init 段和core 段,在modules區為init段和core段分配記憶體, 並把對應的section copy到modules區最終的執行位址,經過relocate函式位址等操作後,就可以執行ko的init操作了, 這樣乙個ko的載入流程就結束了。 同時,init段會被釋放掉,僅留下core段來執行。

輸入指令rmmod,最終在系統核心中需要呼叫sys_delete_module進行實現。具體過程如下:先從使用者空間傳入需要解除安裝的模組名稱,根據名稱找到要解除安裝的模組指標, 確保我們要解除安裝的模組沒有被其他模組依賴,然後找到模組本身的exit函式實現解除安裝。

在linux核心中,符號是指模組中使用evport_symbol宣告的函式和變數。當模組被裝入核心後,它所到處的符號都會被記錄在核心符號表中,在使用insmod載入模組後,模組就被連線到核心,因此可以訪問核心的公用符號。核心匯出符號被稱為模組層疊技術,當其他模組想要從這個模組使用某些資源時,就可以考慮使用匯出符號為其提供服務,如此一來,我們可以將模組分為多個層,通過簡化每一層來實現複雜的專案。modprobe是乙個處理層疊模組的工具,它的功能相當於多次使用insmod, 除了裝入指定模組外還同時裝入指定模組所依賴的其他模組。匯出符號使用下面的巨集

export_symbol(name)

export_symbol_gpl(name)

__init用來修飾函式,__initdata用於修飾變數。帶有__init的修飾符,表示將該函式放到可執行檔案的__init節區中,該節區中的內容只能用於模組的初始化階段,初始化階段執行完畢之後,這部分的內容就會被釋放掉,所以我個人認為這是一種很好的節約系統記憶體的方式。__exit,表示將該函式放在可執行檔案的__exit節區, 當執行完模組解除安裝階段之後,就會自動釋放該區域的空間。__exit用於修飾函式,__exitdata用於修飾變數。 巨集定義module_exit用於告訴核心,當解除安裝模組時,需要呼叫哪個函式。

__init、__initdata巨集定義(位於核心原始碼/linux/init.h)

#define __init __section(.init.text) __cold notrace

#define __initdata __section(.init.data)

module_init巨集定義

#define module_init(x) __initcall(x);
module_exit巨集定義

#define module_exit(x) __exitcall(x);
__exit、__exitdata巨集定義

#define __exit __section(.exit.text) __exitused __cold notrace

#define __exitdata __section(.exit.data)

linux驅動學習 二 核心模組

因為linux 核心的整體結構非常龐大,包含的元件非常多,如何使用需要的元件呢?有一種方法是把所有的元件都編譯進核心檔案 zimage 或bzimage 但是這樣會產生兩個問題 一是生成的核心檔案過大 二是如果要新增或刪除某乙個元件,需要重新刪除編譯整個核心。於是我們需找另外一種機制讓核心檔案本身不...

Linux核心驅動模組的刪除

今天看了 linux裝置驅動開發詳解 的第四章模組和第五章檔案。學長給了乙個的任務 刪除linux核心中的dm9000的驅動模組,重新編譯核心。這篇文章現在寫肯定還不夠完善,我之後我會再補全,所以先打乙個 的標記。首先,我從檔案中找到dm9000驅動模組所在位置,在 drives net下。於是,我...

Linux核心驅動 模組編譯技巧

export arch arm export cross compile usr arm arm linux export subdirs dir 有時候我們無法獲取裝置的核心原始碼或者獲得的原始碼與裝置中的核心版本不同,此時如果安裝核心模組會提示exec format error錯誤,同時會在dm...