Linux驅動基礎

2021-07-25 13:54:25 字數 3022 閱讀 3957

裝置驅動充當了硬體和應用軟體之間的紐帶,它使得應用軟體只需要呼叫系統軟體的應用程式設計介面(api)就可讓硬體去完成要求的工作。本文主要講解了linux裝置驅動與硬體的關係,linux裝置驅動的開發模式以及核心中相關的重要基礎資料結構。

對裝置驅動最通俗的解釋就是「驅使硬體裝置行動」。驅動與底層硬體直接打交道,按照硬體裝置的具體工作方式,讀寫裝置的暫存器,完成裝置的輪詢、中斷處理、 dma 通訊,進行物理記憶體向虛擬記憶體的對映等,最終讓通訊裝置能收發資料,讓顯示裝置能顯示文字和畫面,讓儲存裝置能記錄檔案和資料。

linux對將外設分為3類:

機制強調「提供什麼能力」,而策略旨在「如何使用這些能力」。因此驅動開發需要遵守的是驅動程式的角色是提供機制, 而不是策略。

編寫核心**來訪問硬體, 但是不能強加特別的策略給使用者, 因為不同的使用者有不同的需求。驅動應當做到使硬體可用, 將所有關於如何使用硬體的事情留給應用程式。

linux 提供了一種**動態地載入到核心中機制,這種機制被稱為模組(module)。具有如下特點:

因此驅動多數情況以核心模組的形式載入到核心。

乙個 linux 核心模組主要由如下幾個部分組成:

模組載入函式(一般需要)

當通過 insmod 或 modprobe 命令載入核心模組時,模組的載入函式會自動被核心執行,完成本模組的相關初始化工作。

static int __init initialization_function(void

)module_init(initialization_function);

模組解除安裝函式(一般需要)

當通過 rmmod 命令解除安裝某模組時,模組的解除安裝函式會自動被核心執行,完成與模組解除安裝函式相反的功能。

static

void __exit cleanup_function(void

)module_exit(cleanup_function);

模組許可證宣告(必須)

許可證( license)宣告描述核心模組的許可許可權,如果不宣告 license,模組被載入時,將收到核心被汙染 ( kernel tainted)的警告。在 linux 2.6 核心中,可接受的 license 包括「 gpl」、「 gpl v2」、「 gpl and additional rights」、「 dual bsd/gpl」、「 dual mpl/gpl」 和「 proprietary」。
模組引數(可選)

模組引數是模組被載入的時候可以被傳遞給它的值,它本身對應模組內部的全域性變數。

module_param(引數名,引數型別,引數讀/寫許可權);

module_param_array(陣列名,陣列型別,陣列長,引數讀/寫許可權);

模組匯出符號(可選)

核心模組可以匯出符號( symbol,對應於函式或變數),這樣其他模組可以使用本模組中的變數或函式。

export_symbol(符號名);

export_symbol_gpl(符號名);

模組作者等資訊宣告(可選)

module_author(author);

module_description(description);

module_version(version_string);

module_device_table(table_info);

module_alias(alternate_name);

# makefile2.6

target = demo_module

ifneq ($(kernelrelease),)

#kbuild syntax. dependency relationshsip of files and target modules are listed here.

obj-m := $(target).o

else

# build from shell directly not in kernel root

curdir = $(shell pwd)

kver := $(shell uname -r)

kdir := /lib/modules

/$(kver)/build

all:

$(make) -c $(kdir) m=$(curdir) modules

clean:

$(make) -c $(kdir) m=$(curdir) clean

insert:

sudo insmod $(target).ko

remove:

sudo rmmod $(target)

endif

大部分的基礎性的驅動操作包括3個重要的核心資料結構, 稱為 file_operations, file, 和 inode。

file_operations 結構體中的成員函式是裝置驅動程式設計的主體內容,這些函式實際會在應用程式進行 linux 的 open()、 write()、 read()、 close()等系統呼叫時最終被呼叫。

struct file_operations ;
file 結構體代表乙個開啟的檔案(裝置對應於裝置檔案),系統中每個開啟的檔案在核心空間都有乙個關聯的 struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,核心釋放這個資料結構。

struct file ;
vfs inode 包含檔案訪問許可權、屬主、組、大小、生成時間、訪問時間、最後修改時間等資訊。它是 linux 管理檔案系統的最基本單位,也是檔案系統連線任何子目錄、檔案的橋梁。

struct inode ;

Linux驅動模組基礎

1 模組載入函式 linux核心模組載入函式一般以 init標識宣告,典型的模組載入函式的形式如下 static int init initialization function void module init initialization function 模組載入函式必須以 module in...

Linux驅動基礎開發1

目前,linux軟體工程師大致可分為兩個層次 主要利用c庫函式和linux api進行應用軟體的編寫 從事這方面的開發工作,主要需要學習 符合linux posix標準的api函式及系統呼叫,linux的多工程式設計技巧 多程序 多執行緒 程序間通訊 多工之間的同步互斥等,嵌入式資料庫的學習,ui程...

linux驅動程式基礎

1.分配和釋放裝置號 靜態分配裝置號 int register chrdev region dev t first,unsigned int count,char name 動態分配裝置號 int alloc chrdev region dev t dev unsigned int firstmin...