學習字元驅動程式設計模筆記

2021-06-21 07:41:26 字數 2965 閱讀 2453

裝置驅動模型:

一:驅動初始化

1、分配裝置描述結構

2、初始化裝置描述結構

3、註冊裝置描述結構

4、硬體初始化

二:實現裝置操作

三:驅動登出               

一、驅動初始化

在任何乙個驅動模型中,裝置都會用核心中的一種結構來描述,字元驅動的描述:struct cdev

struct cdev;

可以檢視 /dev 目錄下的裝置號

字元裝置檔案  與 字元裝置驅動  通過主裝置號產生聯絡,通過次 裝置號,區別相同的裝置,如串列埠1,和串列埠2

dev_t 型別來定義裝置號,dev_t 實際是32bit  unsigned int , 其中高 12bit為主裝置,低20bit 為 次裝置號

dev_t dev = mkdev(主裝置號, 次裝置號)   //得到dev_t

主裝置號 = major(dev_t dev)

次裝置號 = minor(dev_t dev)

裝置號-分配

靜態申請:自己選擇乙個數字做為裝置號用 register_chrdev_region 向核心申請使用, 如果 數字已經被占用,則不可以用

動態申請:alloc_chrdev_region  由核心分配

裝置號-登出

在驅動退出時,使用unregister_chrdev_region函式釋放裝置號

裝置操作集    const struct file operations*ops 基本都是函式指標

當應用程式呼叫 open , close, read, write 等時,核心中有一張對映表

比如 應用程式傳遞 open ,核心轉換為 xxopen ,等

而file operations 就是乙個對映表

如: struct file operations dev xops = ;

描述結構

分配: cdev變數

靜態分配: struct cdev mdev;

動態分配: struct cdev *pdev = cdev_alloc();

初始化:

使用cdev_init函式來完成         cdev_init(struct cdev *cdev, const struct file_operations *fops)

引數   cdev:待初始化的cdev結構    

fops:裝置對應的操作函式集

註冊:使用cdev_add函式完成          cdev_add(struct cdev *p, dev_t dev, unsigned count)

引數    p:待新增到核心的字元裝置結構

dev: 裝置號

count: 該類裝置的裝置個數

三個操作之後,就登記好了

二、實現裝置操作

裝置操作原型(不可以更改)如:

int (*open) (struct inode *, struct file *);

開啟裝置,響應open系統

int (*release)(struct inode *, struct file *);

關閉裝置,響應close系統呼叫

loff_t (*llseek) (struct file *, loff_t, int)

重定位讀寫指標,響應lseek系統呼叫

ssize_t (*read) (struct file *, char _user*, size_t , loff_t *)

從裝置讀取資料,響應read系統呼叫

ssize_t (*write) (struct file *, const char _user*, size_t, loff_t *)

向裝置寫入資料,響應write 系統呼叫

linux系統中,每乙個開啟檔案,在核心中都會關聯乙個struct file , 它由核心在開啟檔案時建立,在檔案關閉後釋放。

重要成員:

loff_t f_pos /*檔案讀寫指標*/

struct file_operations *f_op /*該檔案所對應的操作*/

struct  inode

每乙個存在於檔案系統裡面的檔案都會關聯乙個inode結構,該結構主要用來記錄檔案物理上的資訊。因此,它和代表開啟檔案的file結構是不同的。

乙個檔案沒有開啟時不會關聯file結構,但卻會關聯乙個inode結構。

重要成員:

dev_t    i_rdev: 裝置號

open裝置方法是驅動程式用來為以後的操作完成初始化準備工作。在大部分驅動程式中, open完成的工作如下:

1,標明次裝置號

2,啟動裝置

release 方法的作用正好與open相反。 這個裝置有時也稱為close,它應用:

1,關閉裝置。

read 裝置方法通常完成2件事:

1,從裝置中讀取資料(屬於硬體訪問類操作)

2,將讀取到的資料返回給應用程式

ssize_t (*read) (struct file * filp, char _user* buff, size_t  count, loff_t *offp)

file: 與字元裝置檔案關聯的file結構指標,由核心建立。

buff: 從裝置讀取到的資料,需要儲存到的位置,由read系統呼叫提供該引數

count:請求傳輸的資料裡,由read系統提供引數

offp:檔案讀寫位置,由核心從file結構中取出後,傳遞進去。

buff 引數是**於使用者空間的指標,這類指標都不用能被核心**直接引用,必須使用專門的函式

int copy_from_user(void *to, const void_user *from, int n)

int copy_to_user(void _user *to, const void *from, int n) 

三,驅動登出:

當我們從核心中解除安裝驅動程式的時候,需要使用cdev_del函式完成字元裝置的登出

驅動學習 字元裝置驅動總結

字元裝置是 3 大類裝置 字元裝置 塊裝置和網路裝置 中較簡單的一類裝置,其驅動程式中完成的主要工作是初始化 新增和刪除 cdev 結構體,申請和釋放裝置號,以及填充file operations結構體中的操作函式,實現file operations結構體中的read write 和ioctl 等函...

PHP學習,字元操作

一,確定自己的編譯環境。lamp or wamp。如果是linux的話,中文內容不會因為字元格式問題發生亂碼,而windows的話,需要在html標籤加上 確保瀏覽器解釋不會有亂碼。二,要實現相應的字元控制就需要呼叫相應的函式命令。在php中,函式呼叫還是很方便的,例如rand 三,下面的是一些具體...

Python學習(字元編碼)

python主要識別檔案內容,而不是關心拓展名。字元 機器翻譯 二進位制 字元如何對應特定數字的標準就是字元編碼 ascii gbk unicode utf 8 unicode transformation format 記憶體中使用的編碼是unicode,用空間換時間 程式都需要載入到記憶體才能執...