【LV14 day4 字符設備驅動基礎框架】

一、字符設備驅動框架解析

設備的操作函數如果比喻是樁的話(性質類似于設備操作函數的函數,在一些場合被稱為樁函數),則:

驅動實現設備操作函數 ----------- 做樁

insmod調用的init函數主要作用 --------- 釘樁

rmmod調用的exitt函數主要作用 --------- 拔樁

應用層通過系統調用函數間接調用這些設備操作函數 ------- 用樁
1.1 兩個操作函數中常用的結構體說明

內核中記錄文件元信息的結構體
struct inode
{
//…
dev_t i_rdev;//設備號
struct cdev i_cdev;//如果是字符設備才有此成員,指向對應設備驅動程序中的加入系統的struct cdev對象
//…
}
/

1. 內核中每個該結構體對象對應著一個實際文件,一對一
2. open一個文件時如果內核中該文件對應的inode對象已存在則不再創建,不存在才創建
3. 內核中用此類型對象關聯到對此文件的操作函數集(對設備而言就是關聯到具體驅動代碼)
*/

讀寫文件內容過程中用到的一些控制性數據組合而成的對象------文件操作引擎(文件操控器)
struct file
{
//…
mode_t?f_mode;//不同用戶的操作權限,驅動一般不用
loff_t?f_pos;//position 數據位置指示器,需要控制數據開始讀寫位置的設備有用
unsigned?int?f_flags;//open時的第二個參數flags存放在此,驅動中常用
struct?file_operations?*f_op;//open時從struct inode中i_cdev的對應成員獲得地址,驅動開發中用來協助理解工作原理,內核中使用
void?*private_data;//本次打開文件的私有數據,驅動中常來在幾個操作函數間傳遞共用數據
struct?dentry?f_dentry;//驅動中一般不用,除非需要訪問對應文件的inode,用法flip->f_dentry->d_inode
int refcnt;//引用計數,保存著該對象地址的位置個數,close時發現refcnt為0才會銷毀該struct file對象
//…
};
/

1. open函數被調用成功一次,則創建一個該對象,因此可以認為一個該類型的對象對應一次指定文件的操作
2. open同一個文件多次,每次open都會創建一個該類型的對象
3. 文件描述符數組中存放的地址指向該類型的對象
4. 每個文件描述符都對應一個struct file對象的地址
*/

1.2 字符設備驅動程序框架分析

驅動實現端:
在這里插入圖片描述

驅動使用端:
在這里插入圖片描述整體流程以open函數為例
應用層app系統調用open函數使用文件名,struct inode查詢是否有該文件名的對象,若沒有則創建,有則查詢該設備的設備好devno對應的cdev對象,再通過cdev對象得到操作函數集fops,然后open函數創建struct file對象將操作函數集設置到該對象下面的成員f_ops里面,再把struc file對象填到描述符數組里面,得到文件描述符,同時調用驅動程序的drive_open函數,再通過system_open函數返回文件描述符給到應用層的open函數。

若要調用read函數則根據文件描述符找到對應的struct file 對象然后通過里面的f_ops操作函數集調用驅動程序對應的read函數。

syscall_open函數實現的偽代碼:

int syscall_open(const char *filename,int flag)
{
dev_t devno;
struct inode *pnode = NULL;
struct cdev *pcdev = NULL;
struct file *pfile = NULL;
int fd = -1;

/*根據filename在內核中查找該文件對應的struct inode對象地址找到則pnode指向該對象未找到則創建新的struct inode對象,pnode指向該對象,并從文件系統中讀取文件的元信息到該對象*/
if(/*未找到對應的struct inode對象*/)
{/*根據文件種類決定如何進行下面的操作,如果是字符設備則執行如下操作*//*從pnode指向對象中得到設備號*/devno = pnode->i_rdev;/*用devno在字符設備鏈表查找對應節點,并將該節點的地址賦值給pcdev*//*pcdev賦值給pnode的i_cdev成員*/pnode->i_cdev = pcdev;
}/*創建struct file對象,并將該對象的地址賦值給pfile*/pfile->f_op = pnode->i_cdev->ops;
pfile->f_flags = flag;/*調用驅動程序的open函數*/
pfile->f_op->open(pnode,pfile,flag);/*將struct file對象地址填入進程的描述符數組,得到對應位置的下標賦值給fd*/return fd;

}

syscall_read函數實現的偽代碼

int syscall_read(int fd,void *pbuf,int size)
{
struct file *pfile = NULL;
struct file_operations *fops = NULL;
int cnt;

/*將fd作為下標,在進程的描述符數組中獲得struct file對象的地址賦值給pfile*//*從struct file對象的f_op成員中得到操作函數集對象地址賦值給fops*//*從操作函數集對象的read成員得到該設備對應的驅動程序中read函數,并調用之*/
cnt = fops->read(pfile,pbuf,size,&pfile->f_pos);。。。。
return cnt;

}

1.3 參考原理圖

字符設備驅動框架

Linux字符設備驅動工作原理圖
1.4 常用操作函數說明

int (*open) (struct inode *, struct file ); //打開設備
/

指向函數一般用來對設備進行硬件上的初始化,對于一些簡單的設備該函數只需要return 0,對應open系統調用,是open系統調用函數實現過程中調用的函數,
*/

int (*release) (struct inode *, struct file ); //關閉設備
/

,指向函數一般用來對設備進行硬件上的關閉操作,對于一些簡單的設備該函數只需要return 0,對應close系統調用,是close系統調用函數實現過程中調用的函數
*/

ssize_t (*read) (struct file *, char __user *, size_t, loff_t ); //讀設備
/

指向函數用來將設備產生的數據讀到用戶空間,對應read系統調用,是read系統調用函數實現過程中調用的函數
*/

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t ); //寫設備
/

指向函數用來將用戶空間的數據寫進設備,對應write系統調用,是write系統調用函數實現過程中調用的函數
*/

loff_t (*llseek) (struct file , loff_t, int); //數據操作位置的定位
/

指向函數用來獲取或設置設備數據的開始操作位置(位置指示器),對應lseek系統調用,是lseek系統調用函數實現過程中調用的函數
*/

long (*unlocked_ioctl) (struct file , unsigned int, unsigned long);//讀寫設備參數,讀設備狀態、控制設備
/

指向函數用來獲取、設置設備一些屬性或設備的工作方式等非數據讀寫操作,對應ioctl系統調用,是ioctl系統調用函數實現過程中調用的函數
*/

unsigned int (*poll) (struct file *, struct poll_table_struct );//POLL機制,實現對設備的多路復用方式的訪問
/

指向函數用來協助多路復用機制完成對本設備可讀、可寫數據的監控,對應select、poll、epoll_wait系統調用,是select、poll、epoll_wait系統調用函數實現過程中調用的函數
*/

int (*fasync) (int, struct file , int); //信號驅動
/

指向函數用來創建信號驅動機制的引擎,對應fcntl系統調用的FASYNC標記設置,是fcntl系統調用函數FASYNC標記設置過程中調用的函數
*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

都說了能不動就別動,非要去調整,出生產事故了吧

MyBatis 替換成 MyBatis-Plus 背景介紹 一個老項目,數據庫用的是 MySQL 5.7.36 , ORM 框架用的 MyBatis 3.5.0 , mysql-connector-java 版本是 5.1.26 新來了一個干練的小伙,精力充沛,看著就是一個喜歡折騰的主 他…

leetcode 3.1

leetcode hot 100 雙指針1.三數之和2.接雨水 多維動態規劃1.最長公共子序列 雙指針 1.三數之和 三數之和 排序 雙指針的方法&#xff0c;固定一個數nums[i], 用兩數和找target - nums[i] 的數需要注意兩點: 1.需要去掉重復數字 while (l < r && nums[l] nums[…

社交APP開發能給用戶帶來什么

現在的社交軟件也非常的多&#xff0c;每款社交軟件都有自己的特色&#xff0c;社交軟件是日常中必備的軟件&#xff0c;不管是生活交流還是感情工作交流都是比較方便的&#xff0c;因為社交軟件滿足了日常的遠程交流問題&#xff0c;所以開發社交軟件也會逐漸的流行起來的。 …

Error: T doesn‘t have .length

Error: T doesn‘t have .length 在 TypeScript 中&#xff0c;當我們使用泛型 <T> 時&#xff0c;有時會遇到一個常見問題&#xff1a;編譯器提示錯誤&#xff0c;指出泛型類型 T 不具備 .length 屬性。在本文中&#xff0c;我們將探討這個問題的解決方案&#xff0c;并…

【Qt學習】QLCDNumber的介紹與實例使用(倒計時功能)

文章目錄 1. 介紹2. 實例 - QLCDNumber倒計時3. 資源文件 1. 介紹 QLCDNumber是Qt框架中用于顯示數字的控件&#xff0c;它模擬了一個液晶數字顯示屏。 在Designer界面中顯示如下&#xff1a; 有以下 常用屬性&#xff1a; 屬性描述intValue獲取或設置QLCDNumber顯示的整數…

Redis高級特性詳解:事務處理、發布訂閱、持久化和集群

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的基于內存的數據結構存儲系統&#xff0c;被廣泛應用于緩存、隊列、計數器等場景中。除了基本的鍵值存儲功能外&#xff0c;Redis還提供了許多高級特性&#xff0c;包括事務處理、發布訂閱、持久化和集群。在…

js截取圖片地址后面的參數和在路徑中截取文件名或后綴名

文章目錄 前言截取地址 &#xff1f;后面的參數在路徑中截取文件名或后綴名總結 前言 在處理網頁上的圖片資源或者其他類型的文件資源時&#xff0c;你可能會遇到需要使用這些技巧的情況。以下是一些具體的使用場景&#xff1a; 動態修改圖片參數&#xff1a;如果你有一個圖片U…

【BBuf的CUDA筆記】十四,OpenAI Triton入門筆記三 FusedAttention

0x0. 前言 繼續Triton的學習&#xff0c;這次來到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton來實現FlashAttention V2。對于FlashAttention和FlashAttention V2網上已經有非常多的介紹了&#xff0c;大家如…

Win11系統安裝安卓子系統教程

隨著Win11系統的不斷普及&#xff0c;以及硬件設備的更新換代&#xff0c;我相信很多同學都已經更新并使用到了最新的Win11系統。那么&#xff0c;Win11系統最受期待的功能“Windows Subsystem for Android”&#xff08;簡稱WSA&#xff09;&#xff0c;即《安卓子系統》。他可…

spring.factories的常用配置項

概述 spring.factories 實現是依賴 spring-core 包里的 SpringFactoriesLoader 類&#xff0c;這個類實現了檢索 META-INF/spring.factories 文件&#xff0c;并獲取指定接口的配置的功能。 Spring Factories機制提供了一種解耦容器注入的方式&#xff0c;幫助外部包&am…

掘根寶典之C語言字符串輸入函數(gets(),fgets(),get_s())

字符串輸入前的注意事項 如果想把一個字符串讀入程序&#xff0c;首先必須預留該字符串的空間&#xff0c;然后用輸入函數獲取該字符串 這意味著必須要為字符串分配足夠的空間。 不要指望計算機在讀取字符串時順便計算它的長度&#xff0c;然后再分配空間(計算機不會這樣做&a…

ai圖生文的軟件!分享4個受歡迎的!

在數字化時代&#xff0c;隨著人工智能技術的飛速發展&#xff0c;AI圖生文軟件已經成為自媒體人、創作者和廣告從業者手中的得力助手。這些軟件能夠將靜態的圖片轉化為生動的文字&#xff0c;為圖片注入靈魂&#xff0c;讓觀者仿佛置身于畫面之中。今天&#xff0c;就讓我們一…

LabVIEW和Python開發微細車削控制系統

LabVIEW和Python開發微細車削控制系統 為滿足現代精密加工的需求&#xff0c;開發了一套基于LabVIEW和Python的微細車削控制系統。該系統通過模塊化設計&#xff0c;實現了高精度的加工控制和G代碼的自動生成&#xff0c;有效提高了微細車削加工的自動化水平和編程效率。 項目…

cjson報錯

今天遇到個問題&#xff0c;使用CJSON把一個cjson對象給一個cjson對象的時候報錯&#xff0c;是segment問題 &#xff0c;原因是我在個cjson對象數據的時候&#xff0c;有幾個是char的&#xff0c;但是是個時間的字符串&#xff0c;一般20位就夠了&#xff0c;但是由于是通過mo…

1950-2022年各省逐年平均降水量數據

1950-2022年各省逐年平均降水量數據 1、時間&#xff1a;1950-2022年 2、指標&#xff1a;省逐年平均降水量 3、范圍&#xff1a;33省&#xff08;不含澳門&#xff09; 4、指標解釋&#xff1a;逐年平均降水數據是指當年的日降水量的年平均值&#xff0c;不是累計值&#…

ONLYOFFICE 桌面編輯器 v8.0 更新內容詳細攻略

文章目錄 引言PDF 表單RTL 支持電子表格中的新增功能Moodle 集成用密碼保護 PDF 文件從“開始”菜單快速創建文檔本地界面主題下載安裝桌面編輯工具總結 引言 官網鏈接&#xff1a; ONLYOFFICE 官方網址 ONLYOFFICE 桌面編輯器是一款免費的文檔處理軟件&#xff0c;適用于 Li…

面試經典 150 題 ---- 買賣股票的最佳時機 II

面試經典 150 題 ---- 買賣股票的最佳時機 II 買賣股票的最佳時機II方法一&#xff1a;貪心 買賣股票的最佳時機II 方法一&#xff1a;貪心 貪心策略&#xff0c;我們可以考慮局部最優以達到整體最優&#xff0c;僅需要判斷相鄰兩天之間的利潤是否大于 0&#xff0c;若大于 0…

uniapp實現-審批流程效果

一、實現思路 需要要定義一個變量, 記錄當前激活的步驟。通過數組的長度來循環數據&#xff0c;如果有就采用3元一次進行選擇。 把循環里面的變量【name、status、time】, 全部替換為取出的那一項的值。然后繼續下一次循環。 虛擬的數據都是請求來的, 組裝為好渲染的格式。 二…

【打工日常】使用docker部署在線PDF工具

一、Stirling-PDF介紹 Stirling-PDF是一款功能強大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker部署。該自托管 Web 應用程序最初是由ChatGPT全權制作的&#xff0c;現已發展到包含廣泛的功能來處理您的所有 PDF 需求。允許對 PDF 文件執行各種操作&#xff0…

基于session注冊JAva篇springboot

springboot3全家桶&#xff0c;數據庫 &#xff1a;redis&#xff0c;mysql 背景環境&#xff1a;郵箱驗證碼&#xff0c;驗證注冊 流程&#xff1a;先通過郵箱驗證&#xff0c;發送驗證碼&#xff0c;將獲取到的session和驗證碼&#xff0c;存入redis里&#xff08;發送郵箱…