linux主裝置號和次裝置號

來源:互聯網
上載者:User
Linux的裝置管理是和檔案系統緊密結合的,各種裝置都以檔案的形式存放在/dev目錄下,稱為裝置檔案。應用程式可以開啟、關閉和讀寫這些裝置檔案, 完成對裝置的操作,就像操作普通的資料檔案一樣。為了管理這些裝置,系統為裝置編了號,每個裝置號又分為主裝置號和次裝置號。主裝置號用來區分不同種類的裝置,而次裝置號用來區分同一類型的多個裝置。對於常用裝置,Linux有約定俗成的編號,如硬碟的主裝置號是3。

 

      Linux為所有的裝置檔案都提供了統一的操作函數介面,方法是使用資料結構struct file_operations。這個資料結構中包括許多操作函數的指標,如open()、close()、read()和write()等,但由於外設 的種類較多,操作方式各不相同。Struct file_operations結構體中的成員為一系列的介面函數,如用於讀/寫的read/write函數和用於控制的ioctl等。開啟一個檔案就是 調用這個檔案file_operations中的open操作。不同類型的文l件有不同的file_operations成員函數,如普通的磁碟資料檔案, 介面函數完成磁碟資料區塊讀寫操作;而對於各種裝置檔案,則最終調用各自驅動程式中的I/O函數進行具體裝置的操作。這樣,應用程式根本不必考慮操作的是設 備還是普通檔案,可一律當作檔案處理,具有非常清晰統一的I/O介面。所以file_operations是檔案層次的I/O介面。

轉自:http://hi.baidu.com/wudaovip/blog/item/479b451e95c475f81ad57621.html

 

 

 

 

    裝置號是在驅動module中分配並註冊的,也就是說,驅動module擁有這個裝置號(我的理解),而/dev目錄下的裝置檔案是根據這個裝置號建立的,因此,當訪問/dev目錄下的裝置檔案時,驅動module就知道,自己該出場服務了(當然是由核心通知)。
    在Linux核心看來,主裝置號標識裝置對應的驅動程式,告訴Linux核心使用哪一個驅動程式為該裝置(也就是/dev下的裝置檔案)服務;而次裝置號則用來標識具體且唯一的某個裝置。
    在核心中,用dev_t類型(其實就是一個32位的不帶正負號的整數)的變數來儲存裝置的主次裝置號,其中高12位表示主裝置號,低20位表示次裝置號。
    裝置獲得主次裝置號有兩種方式:一種是手動給定一個32位元,並將它與裝置聯絡起來(即用某個函數註冊);另一種是調用系統函數給裝置動態分配一個主次裝置號。

對於手動給定一個主次裝置號,使用以下函數:
int register_chrdev_region(dev_t         first, 
                           unsigned int -count, 
                           char          *name)
    其中first是我們手動給定的裝置號,count是所請求的連續裝置號的個數,而name是和該裝置號範圍關聯的裝置名稱,它將出現在/proc/devices和sysfs中。
    比如,若first為0x3FFFF0,count為0x5,那麼該函數就會為5個裝置註冊裝置號,分別是0x3FFFF0、 0x3FFFF1、 0x3FFFF2、 0x3FFFF3、 0x3FFFF4,其中0x3(高12位)為這5個裝置所共有的主裝置號(也就是說這5個裝置都使用同一個驅動程式)。而0xFFFF0、 0xFFFF1、 0xFFFF2、 0xFFFF3、 0xFFFF4就分別是這5個裝置的次裝置號了。需要注意的是,若count的值太大了,那麼所請求的裝置號範圍可能會和下一個主裝置號重疊。比如若 first還是為0x3FFFF0,而count為0x11,那麼first+count=0x400001,也就是說為最後兩個裝置分配的主裝置號已經不是0x3,而是0x4了!用這種方法註冊裝置號有一個缺點,那就是若該驅動module被其他人廣泛使用,那麼無法保證註冊的裝置號是其他人的 Linux系統中未分配使用的裝置號。

對於動態分配裝置號,使用以下函數:
int alloc_chrdev_region(dev_t         *dev, 
                        unsigned int -firstminor, 
                        unsigned int -count, 
                        char          *name)
    該函數需要傳遞給它指定的第一個次裝置號firstminor(一般為0)和要分配的裝置數count,以及裝置名稱,調用該函數後自動分配得到的裝置號儲存在dev中。動態分配裝置號可以避免手動指定裝置號時帶來的缺點,但是它卻也有自己的缺點,那就是無法預先在/dev下建立裝置節點,因為動態分配裝置號不能保證在每次載入驅動module時始終一致(其實若在兩次載入同一個驅動module之間並沒有載入其他的module,那麼自動分配的裝置號還是一致的,因為核心分配裝置號並不是隨機的,但是書上說某些核心開發人員預示不久的將來會用隨機方式進行處理),不過,這個缺點可以避免,因為在載入驅動module後,我們可以讀取/proc/devices檔案以獲得Linux核心分配給該裝置的主裝置號。

與主次裝置號相關的3個宏:
MAJOR(dev_t dev):根據裝置號dev獲得主裝置號;
MINOR(dev_t dev):根據裝置號dev獲得次裝置號;
MKDEV(int major, int minor):根據主裝置號major和次裝置號minor構建裝置號。

 

 

另解:

      Linux的裝置管理是和檔案系統緊密結合的,把裝置和檔案關聯起來,這樣系統調用可以直接用操作檔案一樣的方法來操作裝置。各種裝置都以檔案的形式存放在/dev目錄下,稱為裝置檔案。應用程式可以開啟、關閉和讀寫這些裝置檔案,完成對裝置的操作,就像操作普通的資料檔案一樣。為了管理這些裝置,系統為裝置編了號,每個裝置號又分為主裝置號和次裝置號。主裝置號用來區分不同種類的裝置,而次裝置號用來區分同一類型的多個裝置。對於常用裝置,Linux有約定俗成的編號,如硬碟的主裝置號是3。

轉自:http://fanyihui1986.blog.163.com/blog/static/784485920091132043905/

來自: http://hi.baidu.com/vv1133/blog/item/08d271941e1f3213d31b70bd.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.