2. 字符設備驅動

一、設備號

1.1. 什么是設備號

設備號是用來標記一類設備以及區分這類設備中具體個體的一組號碼。

設備號由主設備號和次設備號組成。主設備號的作用為標記一類設備、用于標識設備驅動程序,而次設備號的作用是為了區分這類設備中的具體個體設備及用于標識同一驅動程序下的具體設備;通過該區分,系統可以準確的識別和操作每一個設備和對設備的有效管理,提高設備的利用率和可擴展性。

在Linux中設備號的定義通常使用dev_t,該類型需要包含頭文件include/linux/types.h,查看其定義我們可以發現它其實就是一個32位的無符號整型變量;其中主設備號為高12位(同類型驅動個數為0~212?10~2^{12}-10212?1),次設備號為低20位(掛載設備為0~220?10~2^{20}-10220?1)。

Linux中為我們提供了相關宏用于處理設備號,這些宏位于include/linux/kdev_t.h中:

#define MINORBITS 20      /* 次設備號位數 */
#define MINORMASK ((1U << MINORBITS) - 1)/* 獲取主設備號 */
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
/* 獲取次設備號 */
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
/* 主+次組成設備號 */
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))

1.2. 設備號的獲取、釋放和查看

1.2.1. 獲取設備號

獲取設備號的方式有兩種:靜態分配和動態分配,都是Linux內核提供的接口,該接口位于linux/fs.h中。

  • 靜態分配register_chrdev_region
    函數原型:
/*** register_chrdev_region() - register a range of device numbers* @from: the first in the desired range of device numbers; must include the major number.* @count: the number of consecutive device numbers required* @name: the name of the device or driver.** Return value is zero on success, a negative error code on failure.
*/
int register_chrdev_region(dev_t from, unsigned count, const char *name);
  • 動態分配alloc_chrdev_region
    函數原型:
/*** alloc_chrdev_region() - register a range of char device numbers* @dev: output parameter for first assigned number* @baseminor: first of the requested range of minor numbers* @count: the number of minor numbers required* @name: the name of the associated device or driver** Allocates a range of char device numbers. The major number will be* chosen dynamically, and returned (along with the first minor number)* in @dev. Returns zero or a negative error code.*/
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

1.2.2. 釋放設備號

  • 釋放設備號
    函數原型:
/*** unregister_chrdev_region() - return a range of device numbers* @from: the first in the range of numbers to unregister* @count: the number of device numbers to unregister** This function will unregister a range of @count device numbers,* starting with @from. The caller should normally be the one who* allocated those numbers in the first place...*/
void unregister_chrdev_region(dev_t from, unsigned count);

1.2.3. 查看設備號

  • 指令lsblk
    待補充
  • 查看文件/proc/devices
    通過cat /proc/devices將所有的設備號全部打印出來,如下:
Character devices: # 字符設備1 mem4 /dev/vc/04 tty4 ttyS
Block devices: # 塊設備7 loop8 sd9 md
254 mdp
259 blkext

1.3. 栗子

驅動代碼

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/kdev_t.h>int Isalloc = 0; /* 是否動態申請設備號:0-靜態申請、非0-動態申請 */
int Major = 0;
int Minor = 0;module_param(Isalloc, int, S_IRUGO);
MODULE_PARM_DESC(Isalloc, "e.g.是否動態申請: 0-靜態申請(需輸入設備號),非0-動態申請(輸入設備號無效).");
module_param(Major, int, S_IRUGO);
MODULE_PARM_DESC(Major, "e.g.主設備號");
module_param(Minor, int, S_IRUGO);
MODULE_PARM_DESC(Minor, "e.g.次設備號");dev_t chrdev_region = 0;static int chrdev_region_init(void)
{if (0 == Isalloc){/* 靜態申請設備號 */chrdev_region = MKDEV(Major, Minor);/* zhf是驅動程序名稱 */int i32Ret = register_chrdev_region(chrdev_region, 1, "zhf");if (0 > i32Ret){printk("register_chrdev_region err %d \n", i32Ret);}}else{/* 動態申請設備號 zhf是驅動程序名稱 */int i32Ret = alloc_chrdev_region(&chrdev_region, 0, 1, "zhf");if (0 > i32Ret){printk("alloc_chrdev_region err %d \n", i32Ret);}}/* 設備號打印 */printk("chrdev region ok major:%d minor:%d\n", MAJOR(chrdev_region), MINOR(chrdev_region));return 0;
}static void chrdev_region_exit(void)
{/* 設備號銷毀 */unregister_chrdev_region(&chrdev_region, 1);printk("unregister_chrdev_region ok \n");
}module_init(chrdev_region_init);
module_exit(chrdev_region_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhf");

二、字符設備驅動

2.1. 什么是字符設備

字符設備是一種用于傳輸字符或字節流的設備。其實就是傳"acnah"這樣的ASSIC碼。常見的字符設備包括鍵盤、鼠標、串口等設備。字符設備以字節為單位進行讀取和寫入。

字符設備的交互方式:字符設備在系統中會被表示為設備文件,用戶可通過打開設備文件與字符設備進行交互。

2.2. 字符設備的操作

2.2.1. 注冊字符設備

定義字符類設備需要用到cd

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

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

相關文章

uboot armv8 啟動流程之 linker script

section 詳細說明.text按如下順序&#xff0c;中斷向量表vectors, 啟動入口代碼start.o,普通text, glue &#xff08;arm thumb2 相互調用時自動生成的代碼&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 標記為text 段入口&#xff0c;…

xxljob總結

XXL-Job 支持多種任務類型&#xff0c;以下是常見任務類型的示例 Demo&#xff0c;包含核心配置和代碼片段&#xff0c;幫助快速理解用法&#xff1a;一、Bean模式任務&#xff08;最常用&#xff09;通過注解 XxlJob 定義任務方法&#xff0c;直接在 Spring 容器中管理&…

Python包安全工程實踐:構建安全可靠的Python生態系統

在現代計算環境中&#xff0c;性能往往是Python包成功的關鍵因素。本文將深入探討Python包的性能優化技術&#xff0c;包括并發編程模型、性能分析工具、內存優化策略以及原生代碼集成等高級主題&#xff0c;幫助你構建高性能的Python組件。1. 性能分析基礎1.1 性能分析工具矩陣…

kubernetes基礎知識

個人博客站—運維鹿: http://www.kervin24.top CSDN博客—做個超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog一、kubernetes介紹Kubernetes本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器進行…

winntsetup安裝驅動和光驅安裝F6功能一樣----NT5.2.3790源代碼分析

D:\drv>dir驅動器 D 中的卷是 新加卷卷的序列號是 443D-D64BD:\drv 的目錄2025-08-03 23:57 <DIR> . 2025-08-03 23:57 <DIR> .. 2008-05-27 10:01 119,068 yk51x86.cat 2008-05-20 10:01 969,380 yk51x86.inf…

Web 開發 11

今天完成了workshop2&#xff0c;進度有點慢&#xff0c;但是記錄一下極為愚蠢的一輪輪問答和思考~&#xff01;&#xff08;還是有點成就感的&#xff09;ps&#xff1a;【】內為我的提問1 導入語句&#xff08;ES6 模塊導入語法&#xff09;【import CatHappiness from "…

寫作路上的迷茫與突破

曾經&#xff0c;我也是那個在寫作面前躊躇不前的人。每次提筆&#xff0c;滿心都是“我寫不好”“我沒什么可寫的”“我達不到別人的高度”……這些念頭像藤蔓一樣&#xff0c;緊緊纏繞著我&#xff0c;讓我寸步難行。我看著群里的小伙伴們一個個妙筆生花&#xff0c;自己卻只…

23 Active Directory攻擊與防護策略解析

引言 Active Directory&#xff08;AD&#xff09;是企業IT環境中用戶認證、訪問控制和身份管理的核心。因其掌握整個網絡的"鑰匙"&#xff0c;AD常成為攻擊者的首要目標。 從憑證轉儲到隱蔽偵察&#xff0c;攻擊者通過多種手段控制AD。無論您是網絡安全分析師、紅…

【內容規范】關于標題中【】標記的使用說明

【內容規范】關于標題中【】標記的使用說明 在信息爆炸的時代&#xff0c;如何讓內容更易識別、更具條理性&#xff0c;成為內容創作者和平臺運營者共同關注的問題。標題中【】標記的使用&#xff0c;正是在這種需求下形成的一種實用規范。 這種規范的核心作用在于建立統一的內…

centos 9 安裝docker教程

拉取相關依賴 dnf -y install dnf-plugins-core設置阿里云鏡像庫 dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安裝docker dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plu…

關閉Jetbrains Mono字體連寫、連字功能

所謂的關閉Jetbrains Mono字體連寫&#xff0c;其實就是更換為Jetbrains Mono NL字體二者的區別就是符號間距的大小不同&#xff0c;也就是有無連字功能。 下圖以Visutal Studio為例&#xff1a;

漫花軟件集合分享

漫花軟件集合分享的各種apk 1、磁盤漫畫【推薦】 2、你搜 3、皮皮喵 4、潑辣漫畫 5、趣漫畫 6、異次元&圖源 7、漫 8、再漫畫X 9、章魚漫畫 10、芝士漫畫&圖源 通過網盤分享的文件&#xff1a;漫畫軟件 鏈接: https://pan.baidu.com/s/1dlGl50MNzzVOdTP38_…

DB-GPT 0.7.3 版本更新:支持Qwen3 Embedding和Reranker模型、支持知識庫自定義檢索策略等

V0.7.3版本主要新增、增強了以下核心特性 &#x1f340; 支持Qwen3 Embedding和Reranker模型 &#x1f340; 支持知識庫自定義檢索策略&#xff1a;語義檢索、全文檢索、樹形檢索、混合檢索等 &#x1f340; 新增GaussDB數據源支持 &#x1f340; 支持GLM-4.1V多模態模型 …

Django常見模型字段

AutoField:數據庫中的自動增長類型&#xff0c;相當于ID自動增長的IntegerField類型字段&#xff0c;對應mysql的Int類型 BooleanField:真/假的布爾類型字段&#xff0c;對應mysql的Tinyint類型 CharField:字符類型字段&#xff0c;對應mysql的varChar類型 DateField:日期字段&…

前端列表封面圖如何自不同圖片比例不變形

設置圖片寬度100%時&#xff0c;若不設置高度&#xff0c;可能導致高度不足導致空白區域。如何實現圖片高度自適應填充&#xff0c;避免空白區域&#xff1f;解決方式&#xff1a;加上height&#xff1a;100%&#xff1b;object-fit:cover&#xff1b;就可以始終剪切鋪滿&#…

記錄一次Spring Cloud Gateway配置的跨域處理:解決 ‘Access-Control-Allow-Origin‘ 頭包含多個值的問題

在微服務架構中&#xff0c;前端與后端分離已經成為一種常見模式。這種模式下&#xff0c;前后端通常會部署在不同的域名或端口上&#xff0c;這就導致了跨域資源共享&#xff08;CORS&#xff09;問題。最近&#xff0c;在我們的項目中&#xff0c;我們遇到了這樣一個問題&…

掃雷游戲完整代碼

掃雷游戲完整代碼test.cgame.cgame.h

vue打包后如何在本地運行?

1.打包前的配置打開vue.config.js配置如圖所示內容//打包配置文件 module.exports {assetsDir: static,parallel: false,publicPath: ./, };這段代碼是Vue.js項目的打包配置文件&#xff0c;主要功能包括&#xff1a; - assetsDir: static - 設置靜態資源文件夾名為static - p…

Python特性工廠函數詳解:優雅管理屬性驗證

在Python中&#xff0c;特性(property)是一種強大的工具&#xff0c;它允許我們在訪問屬性時執行自定義邏輯。本文將深入分析一個名為quantity的特性工廠函數&#xff0c;它用于確保屬性值必須為正數。 特性工廠函數的概念 特性工廠函數是一種創建并返回property對象的函數&…

Ubuntu系統VScode實現opencv(c++)鼠標操作與響應

在之前的創作中心-CSDN滾動條調整圖片亮度-CSDN博客創作中心-CSDN中,我們已經了解了滾動條實現亮度以及對比度調節,為了實現對圖像中感興趣區域&#xff08;ROI, Region of Interest&#xff09;的交互式選取&#xff0c;本文利用 OpenCV 提供的鼠標事件回調機制&#xff0c;設…