驅動是模組程式,模組程式不一定都是驅動
模組三要素
模組許可宣告
module_license("gpl");
載入函式
預設是int init_module(void)
成功返回0
失敗返回負數錯誤碼
解除安裝函式
預設是void cleanup_module(void)
模組與應用程式的區別
modules
執行空間
核心空間
使用者空間
程式入口
載入函式
main函式
資源管理
自己申請與**
系統自動申請與**
模組編譯與執行的兩個前提條件:
使用配置並編譯後的核心原始碼
編譯模組所用核心版本必須與執行模組時核心版本一致
模組編譯
進入模組原始碼目錄,執行make
makefile 如下:
ifeq ($(kernelrelease),)#kerneldir ?= /home/lht/kernel2.6/linux-2.6.14
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 modules* module*
.phony: modules modules_install clean
else
obj-m :=
hello.o
hello
-objs := hello.c
endif靜態編譯模組與動態編譯模組格式obj-m := .o
-m := .c .c ...
靜態編譯模組
動態編譯模組
編譯方式
以<*>方式編譯模組
以方式編譯模組
模組載入時間
在kernel啟動時載入
需要時由使用者載入
模組存放位置
zimage中
以.ko方式存在模組
內部模組與外部模組
內部模組
外部模組
編譯方式
在kernel目錄下 make module,動態編譯
模組目錄下 make,動態編譯
模組編譯位置
模組位於kernel原始碼內部
模組在kernel原始碼外部
載入方式
modprobe,insmod
insmod
解除安裝方式
modprobe -r,rmmod
rmmod
模組依賴度
會有模組依賴
很少有模組依賴
modinfo:intree
y沒有該項
modprobe 在載入與解除安裝時,能夠根據kernel原始碼下的modules.dep,modules.dep.bin處理依賴
insmod,rmmod 不能處理模組依賴,需要手動解決模組依賴
modprobe在載入模組時,先載入依賴的模組,再載入指定的模組
modprobe在解除安裝模組時,如果當前模組沒有被依賴,先解除安裝該模組,再檢查依賴,如果其依賴沒有被別的依賴,則該模組也被解除安裝。
模組**格式
#include引入指定的kernel標頭檔案#include
#include
module_license("gpl");
module_author("xufeng");
module_description("hello device");
module_supported_device("testdevice");
static int __init hello_init(void)
static void __exit hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
#include指定載入模組的載入,解除安裝函式#include
#include
module_init ();__init關鍵字效果module_exit ();
靜態載入時,新增到kernel的.init初始化段,之後不能被解除安裝__exit關鍵字效果動態載入時,無效果
靜態載入時,不編譯,因為靜態編譯的模組不能解除安裝static關鍵字效果動態載入時,無效果
防止函式名重複
新增模組詳細資訊
module_license("gpl");模組匯出符號表module_author("lvxinliang [email protected]");
module_description("hello device");
module_supported_device("testdevice");
export_symbol(符號名);export_symbol(符號名);
linux核心模組的程式結構
有關命令
檢視核心列印資訊
dmesg 顯示訊息
dmesg -c 清空訊息
載入模組
insmod 《模組名.ko>
modprobe 《模組名》
列出所有載入的模組
lsmod
解除安裝模組
rmmod 《模組名》
modprobe -r 《模組名》
檢視模組詳細資訊
modinfo 《模組檔名》
檢視核心符號表
cat /proc/kallsyms
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
Linux裝置驅動學習一 裝置和驅動的註冊
使用itop 4412開發板,用的是scp 1g的板子。首先是對外部裝置的操作的三部曲 1.通過原理圖找到裝置連線的pin腳 處理器的資料手冊 3.編寫程式實現裝置的操作 1.裝置和驅動的註冊流程 一般都是先註冊裝置,再註冊驅動。現在引入的熱插拔裝置是先註冊的驅動。1 註冊裝置使用結構體platfo...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...