驅動開發之字元裝置驅動(第七天)

2021-09-12 09:24:26 字數 2246 閱讀 8212

linux系統中根據驅動程式實現的模擬框架將裝置的驅動分為了三大類:

一:字元裝置驅動

裝置對資料的處理是按照位元組流的形式進行的,可以支援隨機訪問,也可以不支援隨機訪問,因為資料流量通常不是很大,所以一般沒有頁快取記憶體(是linux核心實現磁碟快取。它主要用來減少對磁碟的i/o操作。具體地講,是通過把磁碟中的資料快取到物理記憶體中,把對磁碟的訪問變為對物理記憶體的訪問)。典型的字元裝置有串列埠(序列介面)、鍵盤、幀快取裝置等。以串列埠為例,串列埠對收發的資料長度沒有具體要求,可以是任意多個位元組;串列埠也不支援lseek操作,即不能定位到乙個具體的位置進行讀寫,因為串列埠按順序傳送或接受資料;串列埠的資料通常儲存在乙個較小的fifo中,並且不會重複利用fifo中的資料。幀快取裝置(就是我們通常說的顯示卡)也是乙個字元裝置,但它可以進行隨機訪問,這樣我們就能修改某個具體位置的幀快取資料,從而改變螢幕上的某些確定畫素點的顏色。

1.1 字元裝置驅動基礎

注:裝置檔案會比普通檔案多出兩個數字,這兩個數字分別是主裝置號和次裝置號。這兩個號是裝置在核心中的身份或標誌,是核心區分不同裝置的唯一資訊。通常核心用主裝置號區別一類裝置,次裝置號用於區分同一類裝置單不同個體或不同分割槽。而路徑名則是使用者層用於區別裝置資訊的。

mkmod命令(make node):建立了乙個節點,所以裝置檔案有時又叫做裝置節點。

在linux系統中,乙個節點代表乙個檔案,建立乙個檔案最主要的根本工作就是分配乙個新的節點(存在於磁碟上的節點,之後會看到位於記憶體中的節點inode),包含節點號的分配(節點號在乙個檔案系統中是唯一的,可以以此來區別不同的檔案),然後初始化好這個新節點(包含檔案模式、訪問時間、使用者id、組id等元資料資訊,如果是裝置檔案還要初始化好裝置號),再將這個初始化好的節點寫入磁碟。還需要在檔案所在的目錄下新增乙個目錄項,目錄項中包含了前面分配的節點號和檔案的名字,然後寫入磁碟。存在於磁碟上的這個節點用乙個結構封裝。

1.2字元裝置驅動框架

實現乙個字元裝置驅動,最重要的就是構造乙個cdev物件,並讓cdev同裝置號和裝置的操作方法集合相關聯,然後將該cdev結構物件新增到核心的cdev_map雜湊表中。

根據inode中的裝置號——>找到cdev——>根據cdev——>找到關聯的操作方法集合——>呼叫驅動所提供的操作方法來完成對裝置的具體操作

cdev 和file_operations之間的呼叫關係可用下圖來表法

第一步:在驅動中註冊裝置號

①:靜態註冊裝置號

靜態申請裝置號(register_chrdev_region)

int register_chrdev_region(dev_t from, unsigned count, const char *name);

/* 引數:

dev_t from - 要申請的裝置號(起始)

unsigned count - 要申請的裝置號數量

const char *name - 裝置名

返回值:

成功:0

失敗:負數(絕對值是錯誤碼)*/

②:動態註冊裝置號

動態申請裝置號(alloc_chrdev_region)

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

/* 引數:

dev_t *dev - 用於儲存分配到的第乙個裝置號(起始)

unsigned baseminor - 起始次裝置號

unsigned count - 要分配裝置號的數量

const char *name - 裝置名

返回值:

成功:0

失敗:負數(絕對值是錯誤碼)*/

第二步:構造並新增cdev結構物件

①:定義乙個struct cdev型別的全域性變數vsdev

static struct cdev vsdev;

②:定義乙個struct file_operations型別的全域性變數vser_ops

static struct file_operations vser_ops = ;

struct file_operations 

;

實習第七天

昨天經理說今天會刮颱風,所以我們要求停課比較好,畢竟我是乙個非常熱愛生命的人,這絕對不是因為我小時候差點被颱風刮走,真的不是因為這個!可是今天一大早,天氣很涼快,可是再如何涼快,還是沒有暴風雨即將來臨的感覺,為此我們捶胸頓足,為什麼停課,停課也不得不去,因為我們還得以實習生的身份過去,說起這ppt,...

第七天筆記

理解 陣列的基本概念 理解 陣列的分類 陣列的幾個名詞 陣列的應用場景 按維度分類 掌握 定義陣列 掌握 初始化陣列 掌握 陣列的使用 指定陣列的元素個數,對陣列進行部分顯式初始化 不指定元素個數,定義的同時初始化,它是根據大括號中的元素的個數來確定陣列的元素 個數 int nums 指定元素個數,...

工作第七天

dns是一種阻止層域層次結構的計算機和網路服務命名系統,它用於tcp ip網路,他從事將主機名或網域名稱轉換為實際ip位址的工作 dns domain name system 負責解析url uniform resource locator 其中有遞迴查詢 詢問人改變,詢問內容不變,詢問物件沒有 和...