色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux字符設備驅動模型之字符設備初始化

Linux字符設備驅動模型之字符設備初始化 時間:2018-09-29      來源:未知

因為Linux字符設備驅動主要依賴于struct cdev結構,原型為:

所以我們需要對所使用到的結構成員進行配置,驅動開發所使用到的結構成員分別為:【unsigned int count;】、【dev_t dev;】、【const struct file_operations *ops;】。

開發流程如下圖:

一、字符設備驅動初始化

1、分配設備cdev

Cdev變量的定義可以采用靜態和動態兩種方法進行分配。靜態方法直接分配內存,而動態方法隨機分配內存。

靜態分配cdev:

定義:struct cdev mdev;

mdev即代表相應的字符設備空間地址。

動態分配cdev:

定義:struct cdev *pdev = cdev_alloc();

pdev即代表對于的字符設備的空間地址。

2、初始化設備cdev

Linux內核中,字符設備struct cdev的初始化使用cdev_init。其原型如下:

參數:

cdev:待初始化的struct cdev結構

fops:設備對應的操作函數集

由原型所要求的參數可知,需要初始化一個字符設備,必須根據申請一個struct cdev結構的空間,然后對其成員進行配置。即實現設備的操作函數集、為設備申請設備號(包括主設備號和次設備號)、指定此類型的字符設備有多少個相同設備。

3、注冊設備cdev

Linux內核中字符設備的注冊使用cdev_add函數來進行完成注冊。其原型如下:

其相關參數定義為:

p:待添加到內核中的字符設備結構,即為struct cdev。

dev:設備號

count:該類設備的設備數量,各個設備的區別體現為從設備號。

在開發驅動時,當確定了字符設備的結構,主設備號和從設備號、設備的數量,就可以使用cdev_add函數將相應的字符設備添加到Linux內核驅動中進行注冊。

4、硬件初始化

關于硬件的初始化就簡單了。直接根據所需要操作的字符設備,閱讀器Datasheet,然后根據Datasheet進行硬件的配置即可。

二、設備操作和驅動操作映射

從上圖基本可知,在用戶空間的每一種硬件設備操作函數,在內核空間通用有一個映射操作函數實現。

•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系統調用

從以上函數指針操作方法中可以提取出兩個重要的參數成員,即為struct file和struct inode。

【struct file】:在Linux系統中,每一個打開的文件,在內核中都會對應的關聯一個struct file結構體,它由內核在打開文件時創建,在文件關閉后釋放。

其非常重要的成員有:

loff_t f_pos /*文件讀寫指針*/

struct file_operations *f_op /*該文件所對應的操作*/

【struct inode】:每一個存在于文件系統里面的文件都會關聯一個inode 結構,該結構主要用來記錄文件物理上的信息。因此, 它和代表打開文件的file結構是不同的。一個文件沒有被打開時不會關聯file結構,但是卻會關聯一個inode 結構。

在struct inode結構中,dev_t i_rdev尤其重要,表示設備號。

三、struct file_operations結構常用設備操作解析

1.open設備操作

根據原型可知,open設備函數方法是在進行開始啟用操作設備時的初始化工作,與用戶空間的open函數對應,通常情況下,open函數實現:

(1)表明次設備號

(2)啟用設備

當然,如果在啟用設備時,不需要任何的準備操作或者初始化操作,那么open函數可以為空函數,不實現。

2.release設備操作

release函數方法的作用正好和open函數方法的作用相反,它在設備關閉時用到,與用戶空間的close對應。通常用來進行關閉設備的實現。如果所操作的設備在關閉時不需要其他操作,那么使其為空函數即可。

3.read設備操作

read方法主要完成兩件事:

(1)訪問硬件操作,從設備中讀取數據。

(2)將從設備端讀取到的數據返回給用戶空間的應用程序read函數。

其read方法的具體原型可分析如下:

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

參數分析:

filp:與字符設備文件關聯的file結構指針, 由內核創建。

buff : 從設備讀取到的數據,需要保存到的位置。由read系統調用提供該參數。

count: 請求傳輸的數據量,由read系統調用提供該參數。

offp: 文件的讀寫位置,由內核從file結構中取出后,傳遞進來。

那么實際上在這里就存在了一個問題,從內核空間如何將數據返回給用戶空間???

在Linux內核中,為從內核空間將數據返回到用戶空間提供了函數方法,即為:copy_to_user。其原型如下:

之所以采用copy_to_user函數的原因是,buff參數來源于用戶空間的指針,這類指針在內核空間中不能直接被內核代碼直接引用,所以必須采用拷貝的方式進行數據的傳遞。具體的操作過程如下圖表示:

4.write設備操作

write函數方法也主要完成兩件事:

(1)從應用程序提供的地址中取出數據到內核空間。

(2)訪問硬件設備,將數據寫入到設備中。

write函數方法直接對應于用戶空間的write函數。

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

write函數方法的參數基本上和read函數方法類似,在此不再做解釋。

那么實際上在此也存在一個問題,如何將數據從用戶空間取出到內核空間使用???

實際上Linux內核中也提供了相應的方法函數,將用戶空間的數據拷貝到內核空間進行使用,其方法為:copy_from_user。原型如下:

四、設備驅動注銷

當內核中不再需要使用一個字符設備時,我們可以在內核中將相應的設備驅動程序進行卸載。那么就需要對其字符設備進行注銷。Linux內核中為我們提供了cdev_del函數來完成字符設備的注銷。其原型如下:

上一篇:線程互斥與同步

下一篇:ARM異常處理

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 特大巨黑吊性XXXX | 中国一级黄色片 | 亚洲色国产欧美日韩 | 亚洲精品国产一区二区三 | 免费人成视频19674不收费 | 好男人hd免费观看 | 亚洲精品拍拍央视网出文 | 国产精品久久无码不卡 | 玩弄白嫩少妇XXXXX性 | 精品麻豆剧传媒av国产 | 免费a级午夜绝情美女图片 国产又黄又刺激又高潮的网站 | 国产成人愉拍免费视频 | 亚洲蜜芽在线精品一区 | 制服在线无码专区 | 一级特黄特色的免费大片视频 | 美女18禁一区二区三区视频 | 女性裸体啪啪无遮挡免费网站 | 噜噜噜视频在线观看 | 性迷官| jizzjizzjizz亚洲熟妇 | 在线视频观看成人 | 亚洲欧美日本久久综合网站 | 国产又黄又刺激又高潮的网站 | 给我免费观看片在线观看中国 | a级国产视频 | 久久天天躁狠狠躁夜夜躁2O2O | 亚洲一区精品无码 | 国产精品日韩AV在线播放 | 影视先锋av资源站男人 | 天干夜天天夜天干天 | 三年片免费观看大全国语第5集 | 久久美利坚合众国AV无码 | 一夲道DVD高清无码 老司机精品视频一区二区 美女脱得一二净(无内裤)视频 | 97国语精品自产拍在线观看 | 美女无遮挡免费视频网站 | 在线观看成人无码AV | 美女黄网站人色视频免费国产 | 欧美综合自拍亚洲综合图 | 国产精品V无码A片在线看 | 娇小小小泬ⅩXXX深喉 | 佐山爱痴汉视频一区二区三区 |