Linux系统的主设备号本来是固定的,这没有什么不好。但是,有许多理由要求Linux系统能够自动为设备动态分配主设备号——只要设备驱动程序提出申请。尤其是当你不打算给你的客户提供驱动程序源代码的时候,为了避免与客户的系统中的其他设备相冲突,采用动态获取主设备号的办法是一个好主意。
系统动态分配主设备号带来的问题是,提前创建的设备节点可能失效。在没有udev或者mdev这类机制的小型嵌入式系统中,这个问题显而易见(但是,在这样封闭的嵌入式系统中为什么还要动态分配主设备号呢?这是哲学家该思考的问题)。所以,有些系统管理员想到用脚本实现设备节点的自动创建。这样,写好一个脚本之后,不管内核被重新编译多少次,也不管module的加载顺序怎么修改,都能够以不变应万变。
其实写这样的脚本很简单,因为最关键的,获取major的代码只需要一句:
major=$(grep -q <driver-name> /proc/devices | cut -b1,2,3)
这里要提到/proc/devices这个文件节点。cat一下你会发现,输出结果类似:
# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
6 lp
7 vcs
10 misc
13 input
14 sound
21 sg
29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
216 rfcomm
226 drm
254 pcmcia
Block devices:
1 ramdisk
2 fd
3 ide0
7 loop
8 sd
9 md
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
因此,"grep -q fb /proc/devices"命令得到的结果是
" 29 fb"
再把这个结果作为输入,执行"cut -b1,2,3"之后得到
major=" 29"
虽然29前面还有个空格,但并不耽误你把它写进"mknod /dev/fb0 c $major 0"这条命令里。
简单地利用grep还可以进一步做些事情,例如用
grep -n "Block devices:" /proc/devices
这条命令可以在得到的结果前面加上行号,类似
27:Block devices
再把该结果作为输入,执行"cut -d':' -f1"命令,即可得到行号27。
用相同的方法得到设备驱动名字所在的行号,与27比较,就可以得知你想要创建的设备节点是字符设备还是块设备。
不过,这个方法有些无聊,因为如果你既知道设备节点的名字,又知道设备驱动的名字,却不知道应该创建字符设备还是块设备,那么你真的应该检讨一下了。