Shell脚本根据设备名自动获取设备号

时间:2021-09-21 17:37:53

写驱动的时候如果使用自动分配设备号的方式,在创建设备结点的时候需要在 '/proc/devices' 文件中查看一下所分配的设备号。可以通过awk命令:

awk '{if($2=="your-driver") {print $1}}' /proc/devices

mknod.sh

这个脚本能够自动获取设备号并创建设备节点:

#!/bin/bash

driver=$1
dir=$2
major=`awk "{if(\\$2==\\"$driver\\") {print \\$1}}" /proc/devices`
#major=`awk '{if(\$2=="usb") {print \$1}}' /proc/devices`
mknod /dev/$dir/$driver c $major 0

把脚本保存为 mknod.sh,使用命令'chmod +x mknod.sh'改成可执行文件,再使用如下命令在/dev/your-dir目录下创建设备节点:

./mknod.sh your-driver your-dir

也可在/dev目录下创建设备节点:

./mknod.sh your-driver

在Makefile中加入如下项目:

setup:
    insmod your-mod.ko
    mkdir /dev/your-dir
    ./mknod.sh your-driver your-dir

unsetup:
    rmmod your-mod.ko
    rm -rf /dev/your-dir

major.sh

这个脚本可返回设备号:

#!/bin/bash

driver=$1
awk "{if(\$2==\"$driver\") {print \$1}}" /proc/devices

在Makefile中加入如下内容:

setup:
    insmod your-mod.ko
    mkdir /dev/your-dir
    mknod /dev/your-dir/your-driver c `./major.sh your-driver` 0

unsetup:
    rmmod your-mod.ko
    rm -rf /dev/your-dir

Makefile

Makefile也可以不借助shell脚本实现:

setup:
    insmod your-mod.ko
    mkdir /dev/your-dir
    mknod /dev/your-dir/your-driver c `awk '{if($$2=="your-driver") {print $$1}}' /proc/devices` 0

unsetup:
    rmmod your-mod.ko
    rm -rf /dev/your-dir

需要注意的是Makefile中$的转义和Shell中不一样。在Makefile 中 "$"、"#" 有特殊含义,转义方式为 "/#"、"$$"。

总结

本文尝试了三种方式的Makefile,区别只在于对awk命令进行了不同方式的转义:

setup:
    insmod your-mod.ko
    mkdir /dev/your-dir
    ./mknod.sh your-driver your-dir
    mknod /dev/your-dir/your-driver c `./major.sh your-driver` 0
    mknod /dev/your-dir/your-driver c `awk '{if($$2=="your-driver") {print $$1}}' /proc/devices` 0

注:

  1. 本文中shell脚本可以直接使用,但是Makefile示例需要把your-mod,your-driver,your-dir改成你自己的东西。
  2. 注意'和`的区别,一个在数字键1的左边,一个在;的右边。