helloworldkernel
核心程式結構分析(前提是已經編譯配置好核心)
現在,通過乙個最簡單的helloworld程式來將核心基礎做一下分析~
因為核心在載入之後就一直執行在記憶體中,為了保證linux核心**的小而核心,使用模組的方式來開發驅動。模組就是在硬碟上的一段程式,通過核心特定的操作可以被鏈結到核心中(進入記憶體)。如此,便能保證我們可以選擇自己需要的驅動模組鏈結入核心,而哪些我們不需要的不鏈結進去,可以避免不使用的驅動進入記憶體造成記憶體浪費。知道這一點很重要~
1、先編寫兩個檔案
下面看**,如下:
//標頭檔案,不解釋
#include
#include
//載入檔案
staticint hello_init(void)
//解除安裝檔案
staticvoid hello_exit(void)
/*關鍵的地方,所有這樣的都是在載入時執行的,載入就是進行上面提到的鏈結操作
*上面的程式絲毫無用,因為只有鏈結進入的操作與消除鏈結離開核心的操作
*那麼,下面在鏈結進去的時候進行了哪些操作呢?*/
//模組的標題、描述、作者,沒有實際操作的使用
module_alias("hello1");
module_description("fromlinuxdevice driver design");
module_author("hehe");
//模組許可權,這個很重要,我見到的所有模組都這麼寫
module_license("dualbsd/gpl");
//將模組函式匯出,具體到了**,我暫時也不清楚
module_param(globalmem_major,int,s_irugo);
//最關鍵的兩個函式,在我們寫好**,編譯好了之後,使用鏈結指令,就會執行hello_init函式
//在解除安裝模組時,執行相關指令,就會執行hello_exit函式
module_init(hello_init);
module_exit(hello_exit);
到此,進行下一步,編寫乙個makefile檔案,這樣有了兩個檔案helloworld.c與makefile
makefile檔案內容如下:
ifeq($(kernelrelease),)
kerneldir?= /lib/modules/$(shell uname -r)/build
pwd:= $(shell pwd)
modules:
$(make)-c $(kerneldir) m=$(pwd) modules
modules_install:
$(make)-c $(kerneldir) m=$(pwd) modules_install
clean:
rm-rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.phony:modules modules_install clean
else
obj-m:= helloworld.o
endif
至於makefile為什麼這麼編寫,作用是什麼?需要去學習makefile與kconfig的語法知識,然後結合原始碼裡面的makefile與kconfig檔案進行學習,當然,如果直接就看主目錄下面的makefile,那是很痛苦的一件事,那是最主要的全域性的makefile檔案,看其他簡單的就好《如果名字不是helloworld,可以把倒數第二行的哪個名字改了,然後這個makefile就通用了》
2、執行make操作——在helloworld目錄下面,執行make
錯誤:1、可能是缺少工具外掛程式2、**寫錯了
完成之後,發現目錄下面多了一堆東西,ok了
3、載入模組(如果執行不成功,可能缺少許可權,使用sudo——sudoinsmodhello.ko sudo rmmod hello.ko)
載入insmod(insmodhello.ko)
輸入tail-f /var/log/kern.log ——
指令可以檢視printk
的輸出解除安裝 rmmod(rmmodhello.ko)
載入模組之後:
輸入lsmod————
檢視有哪些模組被載入到核心中,可以看到helloworld
之前**中類似於module_alias一類的,在哪呢?
modinfohello.ko指令(需要在模組目錄下面執行)
總結:下面來總結一下模組進入核心的過程
1、編寫乙個hello.c檔案,乙個makefile檔案(編譯hello.c並編譯為模組)
2、執行make,生成乙個模組(由很多檔案組成,模組只是邏輯上這麼說)
3、載入/解除安裝模組
此外可以通過lsmod
看看是否載入成功,使用modinfo
來檢視模組資訊~
注意:insmod
、lsmod
是怎麼來的?這些可以cd/dev;lslsmod;
指令找到這些可執行檔案,都在dev
下面,至於dev
目錄是幹什麼的,這就涉及到linux
檔案目錄知識了
linux驅動簡單介紹
linux驅動簡單介紹 驅動。顧名思義就是 驅使硬體裝置行動 裝置驅動與底層硬體之間打交道,按照硬體裝置的具體操作方式來讀寫裝置暫存器,最終完成一系列操作。裝置 驅動充當了應用程式和應用軟體直接的紐帶,它使得應用軟體只需要呼叫系統軟體的應用程式設計介面就可以讓硬體完成響應的操作。硬體 裝置驅動和應用...
簡單linux驅動小例子
我們來寫乙個最簡單的字元裝置驅動程式。雖然它什麼也不做,但是通過它可以了解linux的裝置驅動程式的工作原理。把下面的c 輸入機器,你就會獲得乙個真正的裝置驅動程式。不過我的kernel是2。0。34,在低版本的kernel上可能會出現問題,我還沒測試過。define no version incl...
Linux核心以及驅動技術 簡單
無論是vc還是vb,還是c 還是jsp php等等語言,在學習他們之前總是先來乙個hello world的例子,這個好像成了我們程式入門的必經之路。所以在驅動程式的學習上,也離不開這個步驟。但是驅動程式的開發是執行在核心空間的,而應用程式 是執行在使用者空間的,所以驅動程式的開發盒除錯和應用程式的開...