我正在開發嵌入式linux(ARM)的設備驅動程序。 如何編譯作爲內核的一部分生成的KO文件, ,以便在啓動時加載模塊?嵌入式linux驅動程序加載
這是我第一次需要將驅動程序編譯進內核,而不是作爲可加載模塊。所以我不知道該怎麼做。
謝謝, 拉蒙。
我正在開發嵌入式linux(ARM)的設備驅動程序。 如何編譯作爲內核的一部分生成的KO文件, ,以便在啓動時加載模塊?嵌入式linux驅動程序加載
這是我第一次需要將驅動程序編譯進內核,而不是作爲可加載模塊。所以我不知道該怎麼做。
謝謝, 拉蒙。
對於你的第一個問題,我假設你想將驅動程序靜態地構建到內核映像中(而不是模塊)。首先,您要在驅動程序目錄中選擇要放置驅動程序文件的目錄。假設你想把你的文件放在drivers/char/
。將您的文件複製到此目錄中。在drivers/char/
目錄中將會有一個Kconfig
文件,將其打開並在endmenu
之前添加一個像這樣的條目。
config MYDRIVER
bool "This is a driver for something"
default n
help
This is a test driver.
保存文件並在同一目錄中打開Makefile
。轉到文件結尾並添加以下條目。
obj-$(CONFIG_MYDRIVER) += mydriver.o
就是這樣,您已經將文件添加到內核樹中。像往常一樣,現在執行make menuconfig
並選擇MYDRIVER
。
查看此Kernel Compilation article瞭解更多信息。
你需要建立你的設備驅動程序作爲內置。您可以編輯你的內核的.config手動文件,修改「= M」到「= Y」爲屬於你的模塊配置選項,或使用的make menuconfig改變<M>
到<*>
爲您的設備驅動程序。
before -> <M> Your Device Driver Name Here
after -> <*> Your Device Driver Name Here
雖然這是我的,但我不知道這是否是做到這一點的方法。 – stdcall
另一個小問題...如果我設法將模塊靜態鏈接到內核,我可以知道它以什麼順序初始化(在哪些模塊之前和之後...)? – stdcall
http://stackoverflow.com/questions/5669647/linux-order-of-statically-linked-module-loading/5679670#5679670似乎與你的問題有關。簡而言之,模塊初始化順序由以下內容決定:1)內核構建時模塊的鏈接順序; 2)用於模塊的initcall類型(請參閱inlude/linux/init.h)。 –
如[Linux設備驅動程序3ed](http://lwn.net/Kernel/LDD3/)第2章中介紹的那樣,您是否構建在內核樹之外? 除非你必須有一個靜態鏈接的驅動程序,否則你可以看看modprobe在啓動時自動加載你的模塊,參見:'modprobe(8)'和'modprobe.conf(5)'手冊頁。 –
我在內核樹中構建。我不想使用腳本將它作爲模塊加載,我希望它像內核一樣是靜態的,就像其他支持的驅動程序(如USB,ETHERNET) – stdcall