裝置驅動 一

2021-06-20 12:48:01 字數 3401 閱讀 9496

驅動是模組程式,模組程式不一定都是驅動

模組三要素

模組許可宣告

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

#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);

引入指定的kernel標頭檔案
#include

#include

#include

指定載入模組的載入,解除安裝函式

module_init ();

module_exit ();

__init關鍵字效果

靜態載入時,新增到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核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...