主設備號與次設備號以及申請

一個字符設備或者塊設備都有一個主設備號和次設備號。主設備號和次設備號統稱為設
備號。主設備號用來表示一個特定的驅動程序。次設備號用來表示使用該驅動程序的各
設備。例如一個嵌入式系統,有兩個LED指示燈,LED燈需要獨立的打開或者關閉。那么
,可以寫一個LED燈的字符設備驅動程序,可以將其主設備號注冊成5號設備,次設備號
分別為1和2。這里,次設備號就分別表示兩個LED燈。
1.主設備號和次設備號的表示
在Linux內核中,dev_t類型用來表示設備號。在Linux 2.6.29.4中,dev_t定義為一個
無符號長整型變量,如下:typedef u_long dev_t;
u_long在32位機中是4個字節,在64位機中是8字節。以32位機為例,其中高12表示主設備號,低20為表示次設備號,如圖6.1所示。
2.主設備號和次設備號的獲取
為了寫出可移植的驅動程序,不能假定主設備號和次設備號的位數。不同的機型中,主
設備號和次設備號的位數可能是不同的。應該使用MAJOR宏得到主設備號,使用MINOR宏來得到次設備號。下面是兩個宏的定義:
#define MINORBITS? ?20? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? /*次設備號位數*/
#define MINORMASK? ?((1U << MINORBITS) - 1)? ?? ?? ?? ? /*次設備號掩碼*/
#define MAJOR(dev)??((unsigned int) ((dev) >> MINORBITS))
/*dev右移20位得到主設備號*/?
#define MINOR(dev)((unsigned int) ((dev) & MINORMASK))
? ?/*與次設備掩碼與,得到次設備號*/
MAJOR宏將dev_t向右移動20位,得到主設備號;MINOR宏將dev_t的高12位清零,得到次
設備號。相反,可以將主設備號和次設備號轉換為設備號類型(dev_t),使用宏
MKDEV可以完成這個功能。#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))??
MKDEV宏將主設備號(ma)左移20位,然后與次設備號(mi)相與,得到設備號。
3.靜態分配設備號
靜態分配設備號,就是驅動程序開發者,靜態地指定一個設備號。對于一部分常用的設
備,內核開發者已經為其分配了設備號。這些設備號可以在內核源碼documentation/
devices.txt文件中找到。如果只有開發者自己使用這些設備驅動程序,那么其可以選
擇一個尚未使用的設備號。在不添加新硬件的時候,這種方式不會產生設備號沖突。但
是當添加新硬件時,則很可能造成設備號沖突,影響設備的使用。
4.動態分配設備號
由于靜態分配設備號存在沖突的問題,所以內核社區建議開發者使用動態分配設備號的
方法。動態分配設備號的函數是alloc_chrdev_region()。
5.查看設備號
當靜態分配設備號時,需要查看系統中已經存在的設備號,從而決定使用哪個新設備號
。可以讀取/proc/devices文件獲得設備的設備號。/proc/devices文件包含字符設備和
塊設備的設備號,如下所示。[root@tom /]# cat /proc/devices /*cat命令查看
/proc/devices文件的內容*/??Character devices:? ?? ?? ?? ?? ?? ?/*字符設備*/
1 mem? ? 4 /dev/vc/0? ? 7 vcs? ? 13 input? ? 14 sound? ? 21 sg??Block
devices:??/*塊設備*/? ? 1 ramdisk? ? 2 fd? ? 8 sd? ? 253??device-mapper? ? 254 mdp?? 
3. 6.1.3 申請和釋放設備號
 內核維護著一個特殊的數據結構,用來存放設備號與設備的關系。在安裝設備時,應該
給設備申請一個設備號,使系統可以明確設備對應的設備號。設備驅動程序中的很多功
能,是通過設備號來操作設備的。下面,首先對申請設備號進行簡述。
1.申請設備號
在構建字符設備之前,首先要向系統申請一個或者多個設備號。完成該工作的函數是
register_chrdev_region(),該函數在<fs/char_dev.c>中定義:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其中,from是要分配的設備號范圍的起始值。一般只提供from的主設備號,from的次設
備號通常被設置成0。count是需要申請的連續設備號的個數。最后name是和該范圍編號
關聯的設備名稱,該名稱不能超過64字節。
和大多數內核函數一樣,register_chrdev_region()函數成功時返回0。錯誤時,返回
一個負的錯誤碼,并且不能為字符設備分配設備號。下面是一個例子代碼,其申請了
CS5535_GPIO_COUNT個設備號。retval = register_chrdev_region(dev_id,
CS5535_GPIO_COUNT,NAME);
在Linux中有非常多的字符設備,在人為的為字符設備分配設備號時,很可能發生沖突
。Linux內核開發者一直在努力將設備號變為動態的。可以使用
alloc_chrdev_region()函數達到這個目的。
int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name)
在上面的函數中,dev作為輸出參數,在函數成功返回后將保存已經分配的設備號。函
數有可能申請一段連續的設備號,這是dev返回第一個設備號。baseminor表示要申請的
第一個次設備號,其通常設為0。count和name與register_chrdev_region()函數的對應
參數一樣。count表示要申請的連續次設備號個數,name表示設備的名字。下面是一個例
子代碼,其申請了CS5535_GPIO_COUNT個次設備號。retval =
alloc_chrdev_region(&dev_id, 0, CS5535_GPIO_COUNT, NAME);
2.釋放設備號
使用上面兩種方式申請的設備號,都應該在不使用設備時,釋放設備號。設備號的釋放
統一使用下面的函數:void unregister_chrdev_region(dev_t from, unsignedcount);
在上面這個函數中,from表示要釋放的設備號,count表示從from開始要釋放的次設備號

個數。通常,在模塊的卸載函數中調用unregister_chrdev_region()函數。


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

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

相關文章

javascript 變量作用域

為什么80%的碼農都做不了架構師&#xff1f;>>> javascript中的變量的作用域不同于java/c的變量規則。 1、在java/c中&#xff0c;如果有一個全局變量與一個局部變量重名&#xff0c;那么在局部變量的作用域中&#xff0c;局部變量會覆蓋掉全局變量的值。當離開局部…

七月算法--12月機器學習在線班-第五次課筆記—回歸

七月算法--12月機器學習在線班-第五次課筆記—回歸 七月算法&#xff08;julyedu.com&#xff09;12月機器學習在線班學習筆記 http://www.julyedu.com 轉載于:https://www.cnblogs.com/sweet-dew/p/5491271.html

集合添加元素python_Python基礎:列表、字典、元組、集合、添加和刪除元素,增刪...

列表&#xff08;有序&#xff09; 添加 list.append(元素)&#xff1a;在列表末尾添加新的元素 list.extend(seq)&#xff1a;在列表末尾一次性追加另一個序列中的多個值 –seq可以是列表、元組、字典&#xff0c;若為字典,則僅會將鍵(key)作為元素依次添加至原列表的末尾。 l…

file_operations結構體分析 (設備文件的操作)

linux設備驅動中file_operations結構體分析 struct module *owner第一個 file_operations 成員根本不是一個操作; 它是一個指向擁有這個結構的模塊的指針. 這個成員用來在它的操作還在被使用時阻止模塊被卸載. 幾乎所有時間中, 它被簡單初始化為 THIS_MODULE, 一個在 <Linux…

公司網絡搭建及×××到公司配置

一、公司路由器及子網配置公司192.168.1.0/24子網用于服務器集群&#xff0c;192.168.0.0/24子網用于辦公子網&#xff0c;兩個子網物理上不在一塊。公司開業時&#xff0c;申請了電信40Mbps專線光纖&#xff0c;5個IP地址&#xff0c;網關&#xff1a;*.168.112.9 255.255.25…

js——全選框 checkbox

一直會碰見input 全選框的問題&#xff0c;先整理一種情況&#xff1a; 1. <input id"selectAll" type"checkbox" />全選 2. <input typecheckbox idid1 namecb value1 />value1 <input typecheckbox idid2 namecb value2 />value2 &…

手機編寫python程序_Python實現自動上京東搶手機

本文實例為大家分享了Python自動上京東搶手機的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 上次搶榮耀V9&#xff0c;被京東給惡心到了&#xff0c;所以就寫了個簡單的Python來自動搶V9。雖然用的是比較蠢的方法&#xff0c;但覺得還是有可以學習的地方。所以在這…

struct cdev結構體和cdev_init和cdev_add函數

在Linux內核2.6版本以前&#xff0c;注冊一個字符設備的的經典方法是使用register_chrdev&#xff0c;相應的從設備中注銷字符設備的方法是unregister_chrdev&#xff0c;而在2.6版本以后&#xff0c;字符設備函數的注冊與注銷使用的是如下一套方法&#xff1a; #include<li…

藍鷗零基礎學習HTML5第五講 CSS的基礎樣式

藍鷗零基礎學習HTML5第五講 CSS的基礎樣式1.border<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>div {width:0px;height:0px;/*background: url("img/1.jpg…

class_create()函數

內核中定義了struct class結構體&#xff0c;一個struct class 結構體類型變量對應一個類&#xff0c;內核同時提供了class_create()函數&#xff0c;可以用它來創建一個類&#xff0c;這個類存放于sysfs下面&#xff0c;一旦創建了這個類&#xff0c;再調用device_create()函數…

C# 使用Conditional特性而不是#if條件編譯

概述 #if/#endif 語句常用來基于同一份源碼生成不同的編譯結果&#xff0c;其中最常見的就是debug版和release版。但是這些工具在實際應用中并不是非常友好&#xff0c;因為它們容易被濫用&#xff0c;其代碼頁進而難以理解或調試。C#設計中考慮到這個問題&#xff0c;并提供了…

python安裝opencv出現錯誤_Python3安裝OpenCV出錯,如何解決?

$ sudo pip install opencv-python $ sudo pip install opencv-contrib-python 參考下&#xff1a;python作業畢設&#xff1a;安裝人工智能圖像處理工具OpenCV?zhuanlan.zhihu.compython版本安裝 適合所有平臺&#xff1a; $ sudo pip install opencv-python $ sudo pip inst…

PHP中面向對象的圖片處理類

我們對圖片的處理主要是添加水印和等比縮放&#xff0c;在PHP中&#xff0c;封裝一個類來實現兩個功能。源代碼如下&#xff1a;<?php/***圖片處理*/ class Image {//路徑private $path ./upload/;//隨機文件名private $isRandName;//初始化成員方法public function __con…

ioread32函數有關知識

x86體系和ARM體系的尋址方式是有差別的&#xff1a; 在x86下&#xff0c;為了能夠滿足CPU高速地運行&#xff0c;內存與CPU之間通過北橋相連并通過地址方式訪問&#xff0c;而外設通過南橋與CPU相連并通過端口訪問。 在ARM下也實現了類似的操作&#xff0c;通過兩條不同的總線…

幾何分布的期望和方差公式推導_超幾何分布的數學期望與方差推導

考慮 個外表相同的物品&#xff0c;其中有 個同類物品與另一類的 個物品&#xff1b;抽取 個物品&#xff0c;每個物品的抽取等概率隨機。上述便是一個超幾何分布&#xff08;Hypergeometric Distribution&#xff09;的基本模型。抽取 個 類物品的概率 在研究超幾何分布的數學…

FPGA開發全攻略—— 調試

原文鏈接&#xff1a; FPGA開發全攻略連載之十三&#xff1a;FPGA實戰開發技巧&#xff08;12&#xff09; 5.6 大規模設計的調試經驗 在大規模設計的調試應該按照和設計理念相反的順序&#xff0c;從底層測試&#xff0c;主要依靠ChipScope Pro 工具。下面主要介紹ChipScope P…

003很好的網絡博客(TCP/IP)-很全

http://www.cnblogs.com/obama/p/3292335.html 很全的計算機網絡方面的資料。

linux驅動文件操作簡單介紹

1、設備號 主設備號標識設備對應的驅動程序&#xff0c;次設備號由內核使用&#xff0c;用于確定設備文件所指的設備。 通過次設備號獲得一個指向內核設備的直接指針&#xff0c;也可將此設備號當作設備本地數組的索引。 設備編號用dev_t表示&#xff08;Linux/types.h 32位…

php學習筆記細節部分。

<?phpclass Car{public function Car()//構造函數 {//codeing 當實例化類的時候會調用這里面的方法}public function _destruct()//析構函數 {//codeing 對象的所有引用被刪除&#xff0c;或者對象被顯式的銷毀時會執行的函數。 }} l轉載于:https://www.cnblogs.com/OnlyL…

ctypes python_[python學習之路]ctypes,Python

ctypes 基本用法 ctypes 是一個方便 Python 調用本地已經編譯好的外部庫的模塊。 from ctypes import util, CDLL 標準 C 庫 使用 util 來找到標準 C 庫&#xff1a; libc_name util.find_library(c) # on WINDOWS print libc_name msvcr90.dll 使用 CDLL 來加載 C 庫&#xf…