Linux字元裝置驅動初探

2021-06-12 03:15:32 字數 2923 閱讀 6300

一、裝置驅動之資料結構:

1、dev_t :裝置編號,包含主裝置號、次裝置號。

dev_t是乙個32位的數,12位表示主裝置號,20為表示次裝置號

(1)主裝置號= major(dev_t dev)

(2)次裝置號= minor(dev_t dev)

(3)裝置編號= mkdev(int major,int minor)

2、file_operations:裝置驅動向核心提供的操作函式指標結構

static const  struct  file_operations  ***_fops = ;

3、file:檔案結構體代表乙個開啟的裝置檔案

struct file ;

4、inode:資訊節點結構,索引節點。管理檔案的屬性(訪問許可權、大小、最後修改時間等)

struct inode ;

void *i_private; //裝置私有資料指標 };

5、cdev:字元裝置標準結構體

struct cdev ;

二、裝置驅動之核心函式

裝置驅動實現流程:

1、分配裝置號//

動態分配裝置號

intalloc_chrdev_region

(dev_t *dev,           //裝置號

unsigned int firstminor,  //第乙個次裝置號

unsigned int count,      //所請求連續裝置編號的個數。

char *name            //裝置名稱)

//靜態分配裝置號

int register_chrdev_region

( dev_t first, //預分配的裝置號

unsigned int count,//連續裝置編號的個數

char* name//裝置名稱)

2、裝置體結構分配空間

void *kmalloc(size_t size, int flags);

size:分配記憶體大小

flags:要分配記憶體的型別;值為gfp_kernel:表示不能立刻分配記憶體時,要等待

3、        註冊裝置

//初始化裝置

void cdev_init(struct cdev *cdev, const struct file_operations *fops)

//新增裝置到系統,啟用裝置

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

4、釋放和登出裝置

cdev_del(cdev);   //登出cdev,即從系統中刪除此裝置

kfree(devp);      //釋放結構裝置體內存

unregister_chrdev_region(dev_t, 1); //釋放裝置號

5、定義裝置檔案操作函式

開啟、讀寫、裝置控制等

6、宣告裝置的初始化函式和銷毀函式

module_init(***_init);  

module_exit(***_exit);  

三、裝置驅動實現流程探析

1、根據linux規範編寫驅動程式:宣告、實現驅動的初始化函式和退出函式;實現裝置檔案操作函式。

2、載入驅動:insmod ***.so –對應執行模組的初始化函式***_init,初始化驅動,同時把裝置新增到系統,同時啟用裝置。這時可以通過lsmod和cat /proc/devices檢視

3、建立裝置節點,相當於在檔案目錄中新增裝置檔案

通過sudo mknod /dev/testdev c 254 0(裝置檔名、型別為字元裝置、主裝置號為254、次裝置開始序號為0)命令,建立了/dev/testdev裝置節點。

4、命令列操作裝置:

寫資料到裝置:echo hello>/dev/testdev 命令終端通過作業系統呼叫核心驅動的寫函式,把使用者空間的資料寫到核心空間的裝置上。

讀資料到終端:cat /dev/testdev命令終端通過作業系統呼叫核心驅動的讀函式,把裝置上的資料讀到命令列終端。

解除安裝:rmnod:解除安裝裝置,通過作業系統呼叫裝置驅動的解除安裝函式

5、使用者應用程式操作:

a.先開啟裝置檔案,獲取檔案控制代碼:

myfile = open("/dev/testdev",o_rdwr):向作業系統,請求開啟檔案,並傳遞裝置檔案的全路徑,作業系統呼叫驅動的open開啟函式,並傳遞該裝置相關的inode引數和file引數(在裝置載入和建立裝置節點時已產生)。

b.寫檔案:write(myfile,"hello,",sizeof("hellor"));

呼叫檔案系統的標準寫檔案函式,通過作業系統,呼叫核心的裝置驅動的寫函式,並把引數轉換為核心驅動寫函式的標準引數。核心驅動的寫函式,通過呼叫核心的函式,從使用者空間向核心空間寫資料。

c.讀檔案:read(myfile,buffer,size);

通過作業系統,呼叫核心的裝置驅動的讀函式,通過核心的函式,從核心空間向使用者空間的buffer空間寫資料。

d.裝置控制:int ioctl(int fd, ind cmd, …):

通過作業系統呼叫核心裝置驅動的ioctl函式即可。

e. 關閉檔案:close(myfile):作業系統做相應的清理工作,但並不解除安裝裝置驅動。

四、裝置驅動程式編寫實戰

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...

Linux裝置驅動之字元裝置驅動

一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...