【问题标题】:/dev entries generator Script in Linux Device Driver by Jonathan CorbetJonathan Corbet 在 Linux 设备驱动程序中的 /dev 条目生成器脚本
【发布时间】:2013-01-08 07:24:34
【问题描述】:

我已经开始学习“Linux Device Drivers 3rd ed”,但无法理解以下脚本的语法。我知道基本的 shell 脚本,并且可以使用 awk 实用程序来制作基本程序

Q1)/sbin/insmod ./$module.ko $* || 1号出口 a) 说明 insmod 的完整路径需要什么? b)我使用 ./ 来调用可执行文件,但从未在命令中间看到 ./。 c) 是 $module=scull??? d) $* 是什么意思? e) 双棒是干什么用的?

Q2)major=$(awk "\$2= =\"$module\" {print \$1}" /proc/devices) 这条 awk 语句通过哪些步骤来为我们提供 scull 设备? 我没有得到双斜杠“\”和双等号。

#!/bin/sh
module="scull"
device="scull"
mode="664"
# invoke insmod with all arguments we got
# and use a pathname, as newer modutils don't look in . by default
/sbin/insmod ./$module.ko $* || exit 1   
# remove stale nodes   
rm -f /dev/${device}[0-3]   
major=$(awk "\\$2= =\"$module\" {print \\$1}" /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

【问题讨论】:

  • 更新:我已经从 orielly 的 ftp 下载了示例。并且 Q2 中的声明有所改变(没有双斜线)。这是行: major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices) 我还是不明白:s跨度>

标签: bash shell linux-device-driver embedded-linux


【解决方案1】:

第一季度

a) 需要说明 insmod 的完整路径,因为即使您位于 PATH 中未定义的位置,它也始终可以访问
b) ./something 表示某物是位于当前路径中的文件。 ./$module.ko 表示文件 ./scull.ko
c) 同 b
d) $* 表示您提供给 shell 脚本的任何参数。
e) 双管(或 bat)是指 OR。这意味着,insmod 模块,或者如果失败,则返回值 1 退出

我没有第二季度的答案。对不起。

【讨论】:

    【解决方案2】:

    A1.a:当环境不包含 $PATH 变量或 $PATH 不包含“/sbin”路径时,需要 insmod 的绝对路径。 A1.b:问题在哪里? “./” - 只是相对路径。当您需要从当前目录访问某些文件对象时使用它。在“./”表达式的常见情况下,“点”替换 $(pwd) 命令的输出,但不是更快更短。 A1.c:是的,在这个名为“scull”的代码模块中将被加载。什么问题? A1.d:“$*”是一个特殊的shell变量,包含所有传递给这个脚本的参数。 A1.d:“||”是逻辑“或”运算符。

    我需要阅读一些关于 bash 的信息,例如 Advanced Bash-Scripting Guide。本指南前段时间帮助了我。

    第二季度:

    major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices)
    

    在这一行

    awk "\\$2= =\"$module\" {print \\$1}" /proc/devices
    

    作为 subshel​​l 运行,stdout 分配给“主要”变量。在我的 linux 机器中,由于语法错误,这个 awk-command 不起作用,但我在这里认识到 awk-actions。在这种情况下,/proc/devices 的内容被解析,如果第二个单词是等值的“模块”变量,那么将执行大括号中的代码。换句话说,如果该行的第二个单词是“scull”,则打印该行的第一个单词。在我的 linux 机器中,这条线运行良好:

    major=$(awk "\$2 == \"$module\" {print \$1}" /proc/devices)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多