天天看點

HP-UX檢視主、次裝置号

檢視主、次裝置号

  字元裝置驅動的特殊檔案,可以通過ls-l輸出的第一列中的“c”标明。/dev下還有塊裝置,但它們是“b”來識别;盡管如下介紹的某些内容也适用于塊裝置,但我們這章隻關注字元裝置。

  如果你執行ls-l指令,在裝置檔案條目中的最新修改日期前你會看到二個數(用逗号分隔),這個位置通常顯示檔案長度。這二個數就是相應裝置的主裝置号和次裝置号。下面的清單給出了我使用的系統上的一些裝置。它們的主裝置号是10,7,1和4,而次裝置号是0,3,5,64,5和129。

  crw-rw-rw- 1 root root 1, 3 Feb23 1999 null

 

  crw------- 1 root root 10, 1 Feb23 1999 psaux

 

  crw------- 1 rubini tty 4, 1 Aug16 22:22 tty1

 

  crw-rw-rw- 1 root dialout 4, 64 Jun30 11:19 ttyS0

 

  crw-rw-rw- 1 root dialout 4, 65 Aug16 00:00 ttyS1

 

  crw------- 1 root sys 7, 1 Feb23 1999 vcs1

 

  crw------- 1 root sys 7, 129 Feb 23 1999 vcsa1

 

  crw-rw-rw- 1 root root 1, 5 Feb23 1999 zero

       

  主裝置号識别裝置對應的驅動程式。例如,/dev/null和/dev/zero都由驅動程式1管理,而所有的虛拟控制台和序列槽終端都由驅動程式4管理,同樣,vcs1和 vcsa1由驅動程式7管理。當裝置打開(open)時,核心利用主裝置号分派執行相應的驅動程式。

  次裝置号隻由相應的裝置驅動程式使用;核心的其他部分不使用它,僅将它傳遞給驅動程式。是以一個驅動程式管理若幹個裝置并不為奇(如上面的例子所示),次序号提供了一種區分它們的方法。 盡管2.4版本的核心引入了一種新的特性(可選):裝置檔案系統,devfs。如果使用了這種檔案系統,那裝置檔案将變得簡單,但也很原來有很大的不同。另一方面,這新的檔案系統帶來了一些使用者可見的不相容特性。

應用

  當沒有使用devfs時,向系統增加一個驅動程式意味着要指派它一個主裝置号。這一指派過程應該在驅動程式(子產品)的初始化過程中完成,它調用如下函數,這個函數定義在<linux/fs.h>:

  int register_chrdev(unsigned intmajor, const char *name, struct file_operations *fops);

  傳回值提示成功或者失敗。傳回一個負值,表示出錯;傳回零或正值,表示成功。參數major是所請求的主裝置号,name是你的裝置的名字,它将在/proc/devices中出現,fops是一個指向函數隊列的指針,利用它完成對裝置函數的調用。

  主裝置号是一個用來索引靜态字元裝置組的整數,“動态配置設定主裝置号”将在本章的稍後部分中介紹怎樣選擇一個主裝置号。2.0核心支援128個裝置驅動,而2.2和2.4核心支援256個(保留數值0和255為将來使用)。而次版本号(8位位元組的數)并沒有傳遞給register_chrdev函數,因為次版本号是驅動程式自己使用的。開發團隊為了增加核心可能支援的裝置數量而帶來了很大的壓力,在開發樹2.5版本核心的目标中,裝置号至少是16位的。

  一旦裝置驅動程式注冊到核心表中,它的操作都與配置設定的主裝置号比對,何時在字元裝置檔案上操作都與它的主裝置号相關聯,核心都會通過file_operations結構體查找并調用相應的驅動程式中的函數。為了這個原因,傳遞給register_chrdev的指針應該是指向驅動程式中的全局結構體,而不是一個局部的一個子產品初始化函數。

  接下來的問題就是如何給程式一個名字以被它們用來請求你的裝置驅動程式。這個名字必須插入到/dev目錄中,并與你的驅動程式的主裝置号和次裝置号相連。

  在檔案系統上建立一個裝置節點的指令是mknod,而且你必須是超級使用者才能操作。除了要建立的節點名字外,該指令還帶三個參數。例如,指令:

  mknod /dev/scull0 c 254 0

  建立一個字元裝置(c),主裝置号是254,次裝置号是0。由于曆史原因,次裝置号應該在0-255範圍内,有時它們存儲在一個位元組中。存在很多原因擴充可使用的次裝置号的範圍,但就現在而言,仍然有8位限制。

  請注意:如果一旦用mknod生成了一個特别的裝置檔案,它就永遠存在了硬碟上,除非你明白的删除了它。你可以通過執行指令"rm"指令來删除例子中的裝置。

  rm /dev/scull0

動态配置設定主裝置号

  某些主裝置号已經靜态地指派給了大部分常見裝置。在核心源代碼樹的Documentation/device.txt檔案中可以找到這些裝置的清單。由于許多編号已經配置設定了,為新裝置選擇一個唯一的編号是很困難的——可配置的裝置要比主裝置号多得多。

  所幸,可以對主裝置号進行動态配置設定。如果調用register_chrdev時将major設為0,則該函數會自動選擇一個空閑的号碼并傳回作為該裝置的主裝置号。傳回的主裝置号總是正值,而傳回負值時表明出錯。注意如下兩種情況的細微差别:若調用者請求一個動态的主裝置号時函數register_chrdev傳回值為所配置設定的主裝置号,而當成功地注冊到一個預先定義的主裝置号時(即不采用動态配置設定而采用靜态指派方式),函數傳回值為0而非主裝置号。

  對于private dirvers,強烈建議使用動态配置設定的方法來得到主裝置号。相反,如果你的裝置普遍應用在大多數場合甚至要被包含在官方的核心樹中,你就需要指派一個主裝置号作為專用。

  動态配置設定的缺點是:由于配置設定給你的主裝置号不能保證總是一樣的,因而你無法用mknod指令事先建立裝置節點(即裝置檔案)(可在加載子產品時用腳本自動建立)。這意味着你将不能使用Chapter 11中介紹的關于“按需載入子產品(loading-on-demandof your driver)”的先進特性。對于用于一般用途的驅動程式,這不是什麼問題,因為一旦配置設定了裝置号,你就可以從/proc/devices讀取相關的裝置号資訊。

執行個體

  #!/bin/sh

 

  module=”scull”

 

  device =”scull”

 

  mode =”664”

 

  #invoke insmod with all

 

  arguments we were passed

 

  #and use a pathname, as

 

  newer modutils don’t look in. by default

 

  /sbin/insmod –f ./$module.o

 

  $* || exit

 

  #remove stale nodes

 

  rm –f /dev/$(device)[0-3]

 

  major=’awk “

 

  [url=file://///$2==/]\\$2==\[/url]

 

  ”$module\” {print

 

  [url=file://///$1]\\$1[/url]

 

  }” /proc/devices’

 

  mknod /dev/${device}0 c

 

  $major 0

 

  mknod /dev/${device}1 c

 

  $major 1

 

  mknod /dev/${device}2 c

 

  $major 2

 

  mknod /dev/${device}3 c

 

  $major 3

 

  #give appropriate group/permissions, and change the group.

 

  #Not all distributions have staff; some have “wheel” instead.

 

  group=”staff”

 

  grep ‘^staff:’ /etc/group

 

  > /dev/null || group=’wheel’

 

  chgrp $group

 

  /dev/${device}[0-3]

 

  chmod $mode

 

  /dev/${device}[0-3]      

繼續閱讀