在達到能直接修改linux核心的程度之前,我們寫的**都需要以模組的方式新增到核心中去執行。本節就介紹最
簡單的模組編寫和載入方法。
1、首先建立乙個目錄modules,以存放以後編寫的模組。再在其下建立乙個子目錄hello,最為本節建立模組的位置。
2、編寫原始檔hello.c,**如下。
[cpp]view plain
copy
print?
#include
#include
module_license("dual bsd/gpl");
static
int hello_init(void)
static
void hello_exit()
module_init(hello_init);
module_exit(hello_exit);
3、編寫makefile檔案,如下。
[cpp]view plain
copy
print?
"font-size:13px;">kernel_dir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
module-objs := hello.o
obj-m := module.o
default:
make -c $(kernel_dir) m=$(pwd) modules
小插曲:
makefile書寫格式非常嚴格,
all:
縮排》make -c $(kdir) m=$(pwd) $(extra_cflags) modules
default:
縮排》make -c $(kdir) m=$(pwd) $(extra_cflags) modules
clean:
縮排》make -c $(kdir) m=$(pwd) clean
在拷貝網路**的過程中,很可能原有的tab
被若干空格鍵所替代,就會出現
nothing to be done for...
的錯誤.
一定要牢記makefile的書寫格式
這裡先把hello.c編譯為hello.o,再把hello.o合併到module.o,最後生成可載入模組module.ko。其實也可以不通過module.o,直接用hello.o生成可載入模組。只是linux習慣的做法是先把所有的目標檔案合併到乙個目標檔案,再進行其它操作。
4、編譯並載入模組。
[cpp]view plain
copy
print?
$make
編譯生成module.ko
[cpp]view plain
copy
print?
$sudo insmod module.ko
將module.ko加入核心模組
[cpp]view plain
copy
print?
$lsmod
檢視已載入的模組列表,包括module模組
[cpp]view plain
copy
print?
$sudo rmmod module
解除安裝module模組
[cpp]view plain
copy
print?
$dmesg | less
列印最近的5條記錄,會看到在hello_init和hello_exit中列印的資訊。
現在我們已經完全了解了模組編譯載入的流程,相當於開啟了進入核心的大門。以後會接觸到越來越多的核心api,我們能做的事也會越來越多。
如何在andorid 上編譯載入動態模組,可以參考另外一篇文章!
Andorid linux常用的指令
1 adb shell 進入linux開發環境 2 ctrl d 退出linux環境 3 adb devices 顯示電腦上有那些硬體資訊 4 su 切換到超級使用者 代表當前使用者是root使用者 代表當前使用者是普通使用者 5 rm 刪除檔案 adb shell cd sdcard ls ls ...
自己編的分頁模組
因為要做個文字資料庫搜尋系統,順便寫了這個,加了點 美化 美工太差 讀資料時候可以用fread函式和implode結合,例如 msg implode fread data.txt filesize data.txt msg是乙個陣列 廢話 配合for i 0 i mline i 來讀取檔案,mlin...
linux核心hello world模組編寫
include include include int param 0 裝置模組註冊時執行的初始化函式 static int init initialization module void 裝置模組解除安裝的清除函式 static void exit cleanup module void 告之核心...