1. 程式人生 > >02 關於裝置號,裝置節點等一些簡單概念

02 關於裝置號,裝置節點等一些簡單概念

1,裝置 Linux檔案系統/dev/下通常存放了一系列裝置名稱。對裝置的訪問,即訪問這些檔案。 ls -l /dev/ 能看到這些裝置的一些基本資訊。如下圖所示 瞭解過Linux下檔案型別的小夥伴應該對哪些是字元裝置、塊裝置不會感到陌生了。(bcd-lsp分別是塊、字元、目錄、普通、連結、套接字、管道) root後面 那兩個逗號隔開的數字是裝置的主裝置號和次裝置號。那我們跳到下一個概念吧。
2,裝置號 裝置號分為主裝置號和次裝置號; 主裝置號標識裝置對應的驅動程式,次裝置號由核心使用,區分同一個型別的多個裝置,如兩個串列埠。個人認為了解這些就夠了。我們需要重點關注的是驅動程式裡面如何表達這些概念,也就是下一步。 dev_t devno   //定義裝置號,資料型別為dev_t,實際是一個32位的數。 devno = MKDEV(int major, int minor);  //major minor 即我們看到的程式設計師給出的203,0等這些數字。習慣上限於255個主裝置號,255個次裝置號  devno = major << 20 | minor; int major = MAJOR(dev_t devno); int minor = MINOR(dev_t devno);   //與上面的相反,如果你想通過dev_t devno獲得主裝置號和次裝置號的話,可以這麼做。 3,分配和釋放裝置號
直接上程式碼 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char *name); void unregister_chrdev_region(dev_t first, unsigned int count); int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); 引數說明: dev_t first :MKDEV();獲取得到的裝置號, unsigned int count :連續裝置編號的個數 char *name :檔案系統中看到的裝置驅動的名稱,cat /proc/devices 或 ls /dev/下能看到的 初始化時需要register,退出時需要unregister。 alloc顧名思義,動態分配。經常認為通用PC隨機分配,嵌入式產品需提前規劃好,故儘量用靜態。 register成功返回0,失敗返回負的錯誤碼,時刻謹記,可能失敗,所以要新增if判斷。 驅動程式設計師們經常這樣寫:

4,裝置節點 當你驅動程式按上面的步驟寫好後,編譯並且insmod。你會發現檔案系統中: cat /proc/devices/下會出現你新增的裝置名稱,和主裝置號。但是/dev/下並沒有存在你所註冊的dev。這是因為你還沒有建立裝置節點。這時你需要執行如下命令: mknod /dev/name c $major minor 你可以確定count 個裝置節點,根據你程式碼中register時指定的count個數。 動態分配主裝置號有一個缺點:無法預先建立裝置節點。不過,你可以通過/proc/devices/中獲得。如果要寫成指令碼自動分配,可以參考書Page 51,有一個很棒的shell指令碼,幫我們完成了。 最後附上幾行簡單的完整的註冊裝置號程式:  1 #include <linux/module.h>   2 #include <linux/init.h>   3 #include <linux/kernel.h>   4 #include <linux/fs.h>        //note: register_chrdev need it   5   6 MODULE_LICENSE("Dual BSD/GPL");   7   8 static int __init scull_init(void)   9 {  10         dev_t devno = MKDEV(250, 66);  11         int ret;  12  13         printk(KERN_ALERT "scull dev init\n");  14         ret = register_chrdev_region(devno, 3, "scull");  15         if (0 == ret ) {  16                 printk(KERN_ALERT " register success\n");  17         } else {  18                 printk(KERN_ALERT "register fail ret:%d\n", ret);  19                 goto register_fail;  20         }  21  22         return 0;  23 register_fail:  24         unregister_chrdev_region(devno, 1);  25 }  26 static void __exit scull_exit(void)  27 {  28         dev_t devno = MKDEV(250, 66);  29  30         printk(KERN_ALERT "scull exit\n");  31         unregister_chrdev_region(devno, 1);      32 }  33  34 module_init(scull_init);  35 module_exit(scull_exit);                   

相關推薦

02 關於裝置裝置節點一些簡單概念

1,裝置 Linux檔案系統/dev/下通常存放了一系列裝置名稱。對裝置的訪問,即訪問這些檔案。 ls -l /dev/ 能看到這些裝置的一些基本資訊。如下圖所示 瞭解過Linux下檔案型別的小夥伴應該對哪些是字元裝置、塊裝置不會感到陌生了。(bcd-lsp分別是塊、字元、

linux驅動開發之一個真正的裝置驅動需要一些什麼元素(裝置操作方法)

1,需要一個裝置號(重點看下面的程式碼) 因為核心中有很多的裝置驅動,所以需要一個裝置號id來進行區分 裝置號分成兩個部分: 主裝置號:某一

NDK獲取android唯一裝置簡單的將andorid_id 和 serial拼接起來。

NDK獲取android唯一裝置標識 裝置唯一標識只是簡單的將andorid_id 和 serial拼接起來。你也可以使用自己的邏輯進行拼接。 java 實現 native 實現

Linux驅動開發之主裝置找驅動裝置裝置

一、引言   很久前接觸linux驅動就知道主裝置號找驅動,次裝置號找裝置。這句到底怎麼理解呢,如何在驅動中實現呢,在介紹該實現之前先看下核心中主次裝置號的管理:   二、Linux核心主次裝置號的管理   Linux的裝置管理是和檔案系統緊密結合的,各種裝置都以檔

通過裝置將應用程式與驅動程式聯絡在一起

         上一篇介紹了應用程式訪問驅動程式的核心實現的具體過程,那麼應用程式和驅動程式是如何實現配對的呢?這就是裝置號的作用。         首先,建立驅動程式時,我們會在驅動程式中動態或靜態的分配主裝置號。其中,靜態分配在其他驅動已經佔用靜態設定的裝置號的時候容易

Windows下搭建Redis叢集增刪節點以及一些常用命令

Windows 配置Reids叢集 Redis Cluster 前言:本人菜鳥一枚,之前專案要求搭建redis叢集,就研究了一下,總結如下,後續Linux版本的搭建會繼續傳上來,敬請關注,謝謝~~ 1. 下載安裝Redis Redis官方不支援Windows,但是Micr

u-boot2013.01 使用裝置裝置樹獲得bootargs過程分析

u-boot 裝置樹形式獲取bootargs 1. 程式呼叫過程do_bootm bootm_start(cmdtp, flag, argc, argv) bootm_load_os(images.os, &load_end, 1)

利用JNI方法通過WMI獲取本地硬體資訊(主機板型號硬碟序列CPU引數

因為有幾臺伺服器是windows 2000的,之前採用的WMIC方法不適用(windows 2003開始有),更不用說WMI .NET了(採用.NET Framework 3.5),只能採用JNI的方法,通過C++來呼叫本地WMI介面來查詢資料。幸好,這次WMI從windo

Android Studio 打包apk遮蔽log新增所有檔案的行設定編碼配置

在build.gradle中新增以下程式碼: buildTypes {     release {         buildConfigField "boolean","LOG","false"

安卓中阿拉伯語波斯語一些佈局需要翻轉的方法

             在安卓中阿拉伯語系,波斯語系都是一些從右到左的顯示。這時候就需要我們進行適配啦!                                                                                 

驅動雜記1:對驅動物件裝置物件裝置棧的理解

Windows核心採用的是面向物件的程式設計方式,但使用的確是C語言。Windows核心認為許多東西都是“物件”, 比如一個驅動一個檔案一個裝置,“物件”相當於一個基類。    一個驅動物件代表了一個驅動程式,或者說一個核心模組。驅動物件結構如下: typedef stru

資料庫簡介以及MySQL中一些簡單的基本操作

一: 資料庫簡介 1:定義 資料庫,簡單來說是本身可視為電子化的檔案櫃–儲存電子檔案的處所,使用者可以對檔案中的資料進行新增、擷取、更新、刪除等操作。 資料庫是依照某種資料模型組織起來並存放二級儲存器中的資料集合。這種資料集合具有如下特點:儘可能不重複,以最優方式為某個特定組織的多種應用服務

關於“事件”“事件物件”“事件源”幾個概念的理解

事件:指的是滑鼠點選,鍵盤輸入等使用者操作。其本身就是一個物件。 事件物件:事件發生後,在flex中就稱為事件物件,事件物件有針對其的偵聽器,事件物件有其屬性,比如:target。 事件發生的物件:指事件源。 事件源:發生事件的物件,一般指某一具體的元件,

從Ubuntu轉到CentOS對系統做一些簡單的自定義配置

一、背景介紹 之前一直使用Ubuntu14.04做Qt應用程式的開發,前段時間心裡總是吵著鬧著要學習伺服器的開發,故最近在看《鳥哥的私房菜--伺服器架設篇》,那麼我就調查了一下,發現unix及類u

邊緣計算、霧計算、雲端計算一些概念淺析

邊緣計算是什麼呢? ✍邊緣計算可以理解為是指利用靠近資料來源的邊緣地帶來完成的運算程式。 如果用更通用的術語來表示即:鄰近計算或者接近計算(Proximity Computing) 邊緣計算和雲端計算之間的區別是什麼? ✔其實如果說雲端計算是集中式大資料處理,邊緣計算則可以理解為邊緣式大資料處理。

關於凸優化的一些簡單概念

mage 不等式 -c 集合 repl ont mil www 條件 http://www.cnblogs.com/tornadomeet/p/3300132.html 沒有系統學過數學優化,但是機器學習中又常用到這些工具和技巧,機器學習中最常見的優化當屬凸優化了,這

ubuntu更改U盤網盤外部裝置自動掛載

在Ubuntu中,自動掛載除了確保/etc/fstab檔案中沒有相關裝置條目外,還要關閉gsettings的配置項,開啟關閉方法如下: 開啟終端,執行如下命令 **禁止自動掛載:** \$ gsettings set org.gnome.desktop.me

iOS7獲取裝置UDID、IMEI、ICCID、序列、Mac地址資訊

在iOS7之前, 可以方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 來獲取裝置的UDID,但是在iOS7之後這個方法不再適用。 你可以用[[UIDevicecurrentDevice]valueForKey:@"un

總結linux0.11核心中的主裝置

老會忘,記下來方便後面查閱 主裝置 型別 說明 請求操作函式 0 無 無 NULL 1 塊/字元 ram,記憶體裝置(虛擬盤等) do_rd_request 2 塊 fd,軟碟機裝置 do_fd_request 3 塊 hd,硬碟裝置 do_hd_request 4 字元

Sybase 建立資料庫裝置出錯虛擬裝置太大!解決方案

今早為Sybase資料庫新增裝置時出錯: The VDEVNO of 10 is out of range.  The maximum VDEVNO allowed is 9Search得知執行sp_configure 'number of devices',xxx OK!在