1.第乙個模組
hello.c:
#include #include #include static int __init hello_init( void )
static void __exit hello_exit(void)
module_init( hello_init);
module_exit( hello_exit);
module_license( "gpl" );
module_author( "myname" );
這個簡單的程式以包含了模組的主要特徵,每個模組都有乙個入口和出口,在這個程式中是hello_init()和hello_exit(),它們分別通過module_init()和module_exit()系統呼叫註冊到核心中,核心在載入這個模組時,呼叫hello_init()函式,在這個函式中一般做一些初始化工作,如果初始化順利完成,返回零,否則返回乙個非零值。hello_exit()是模組的出口函式,核心在解除安裝該模組是呼叫,負責釋放資源等。
module_license用於指定版權,linux一般使用"gpl"。
module_author用於指定**的工作。
2.構建模組
makefile:
obj-m := hello.o
kerneldir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd)
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
3.載入模組
要載入或
解除安裝以root使用者執行命令insmod或rmmod:
insmod ./hello.ko
使用下面的命令可以看到我們的模組已經載入了:
lsmod | grep hello
使用下面的命令可以解除安裝該模組:
rmmod hello
modinfo hello.ko
4.這是在用lsmod就看不到hello模組了。但是我們的輸入資訊到那去了呢,不急,如果你是在x windows下的xterm中insmod的,你不會看到輸出,使用dmesg就可能看到在載入和解除安裝模組時的輸出內容,只有直接在console下才能直接顯示到螢幕上。
5.4.printk()函式
記住這裡用的是printk而不是printf,在核心中我們是不能呼叫c庫中的函式的,不過c庫上的大部份函式在核心中都有實現。
printk主要是為核心提供日誌功能, 記錄核心資訊或用來給出警告用的,因些在呼叫printk時,我們可以指定輸入資訊的級別,下表列出了可用的級別。
---------------------------
級別 說明
---------------------------
| kern_emerg 緊急情況
| kern_alert 需要立即被注意的錯誤
| kern_crit 臨界情況
| kern_err 錯誤
| kern_warning 警告
| kern_notice 普通的
| kern_info 非正式的訊息
| kern_debug 除錯資訊
---------------------------
以上級別沒有乙個絕對的定義應該在什麼時候用,只能你自己拿主意了。
openwrt開發 1 核心編譯
1.核心編譯前的工具準備。a.安裝vmare10,ubuntu10.04,筆者安裝的為前面的版本。可以選擇其他版本,盡量版本不要太高,不利於開發。b.部署linux系統的環境,例如gcc 服務等環境。2.獲取openwrt原始碼包,可以使用git或svn從openwrt官網獲取。因為筆者使用的是台灣...
Linux應用程式開發 Hello
第一步 在linux平台 我用的是redhat9.2 上安裝好gcc編譯工具,例如編譯arm平台的應用程式可用arm linux gcc,如用在pc平台下執行,可用pc自帶的gcc。第二步 編寫hello程式,可以使用redhat自帶的gedit。程式如下 include int main 並將程式...
ZYNQ開發(一) PS裸奔hello
zynq開發 一 ps裸奔hello world 工具 vivado 2015.4 步驟 1 開啟vivado建立乙個新的工程,選擇工程資料夾存放目錄,填寫工程的名字。2 選擇器件,我的是xc7z010clg400 1根據嚮導一直next。二 ip integrator 1,建立空的block de...