向自己道歉,没能抽出更多的时间,进度如此的慢。

现在想认真学习下scull模块的这个初始化脚本 scull_init.sh

#!/bin/bash
# Sample init script for the a driver module <rubini@linux.it>DEVICE="scull"
SECTION="misc"# The list of filenames and minor numbers: $PREFIX is prefixed to all names
PREFIX="scull"
FILES="     0 0         1 1         2 2        3 3    priv 16 pipe0 32    pipe1 33    pipe2 34   pipe3 35single 48      uid 64     wuid 80"INSMOD=/sbin/insmod; # use /sbin/modprobe if you preferfunction device_specific_post_load () {true; # fill at will
}
function device_specific_pre_unload () {true; # fill at will
}# Everything below this line should work unchanged for any char device.
# Obviously, however, no options on the command line: either in
# /etc/${DEVICE}.conf or /etc/modules.conf (if modprobe is used)# Optional configuration file: format is
#    owner  <ownername>
#    group  <groupname>
#    mode   <modename>
#    options <insmod options>
CFG=/etc/${DEVICE}.conf# kernel version, used to look for modules
KERNEL=`uname -r`#FIXME: it looks like there is no misc section. Where should it be?
MODDIR="/lib/modules/${KERNEL}/kernel/drivers/${SECTION}"
if [ ! -d $MODDIR ]; then MODDIR="/lib/modules/${KERNEL}/${SECTION}"; fi
#专有命令[ (左中括号, 特殊字符). 这个命令与test命令等价, 并且出于效率上的考虑, 这是一个内建命令
# -d FILE  FILE exists and is a directory# Root or die
if [ "$(id -u)" != "0" ]
thenecho "You must be root to load or unload kernel modules"exit 1
fi# Read configuration file
if [ -r $CFG ]; then
# -r FILE   FILE exists and read permission is granted
#看到这儿了,
    OWNER=`awk "\\$1==\"owner\" {print \\$2}" $CFG`
#读取文件$CFG 若第一个域为owner,则打印第二个域,并赋值到变量OWNER
#但是这条指令在shell里未能正常运行,改为如下:类似的样子
# awk '$1=="DEVICE" {print $2}' scull.init
    GROUP=`awk "\\$1==\"group\" {print \\$2}" $CFG`MODE=`awk "\\$1==\"mode\" {print \\$2}" $CFG`# The options string may include extra blanks or only blanksOPTIONS=`sed -n '/^options / s/options //p' $CFG`
#打印包含options的行
fi# Create device files
function create_files () {cd /devlocal devlist=""
    local file
#如果变量用local来声明,那么它只能在该变量声明的代码块(block of code)中可见
    while true; doif [ $# -lt 2 ]; then break; fi
#$# Number of command-line arguments  or positional parameters   -lt  小于
   file="${DEVICE}$1"mknod $file c $MAJOR $2devlist="$devlist $file"shift 2
#The shift command reassigns the positional parameters, in effect shifting them to the left one notch
    doneif [ -n "$OWNER" ]; then chown $OWNER $devlist; fiif [ -n "$GROUP" ]; then chgrp $GROUP $devlist; fiif [ -n "$MODE"  ]; then chmod $MODE  $devlist; fi
#  -n STRING the length of STRING is nonzero
}# Remove device files
function remove_files () {cd /devlocal devlist=""local filewhile true; doif [ $# -lt 2 ]; then break; fifile="${DEVICE}$1"devlist="$devlist $file"shift 2donerm -f $devlist
}# Load and create files
function load_device () {if [ -f $MODDIR/$DEVICE.o ]; then
#-f  FILE exists and is a regular file
 devpath=$MODDIR/$DEVICE.oelse if [ -f ./$DEVICE.o ]; thendevpath=./$DEVICE.oelsedevpath=$DEVICE; # let insmod/modprobe guessfi; fiif [ "$devpath" != "$DEVICE" ]; thenecho -n " (loading file $devpath)"fiif $INSMOD $devpath $OPTIONS; thenMAJOR=`awk "\\$2==\"$DEVICE\" {print \\$1}" /proc/devices`remove_files $FILEScreate_files $FILESdevice_specific_post_loadelseecho " FAILED!"fi
}# Unload and remove files
function unload_device () {device_specific_pre_unload /sbin/rmmod $DEVICEremove_files $FILES
}case "$1" instart)echo -n "Loading $DEVICE"load_deviceecho ".";;stop)echo -n "Unloading $DEVICE"unload_deviceecho ".";;force-reload|restart)echo -n "Reloading $DEVICE"unload_deviceload_deviceecho ".";;*)echo "Usage: $0 {start|stop|restart|force-reload}"exit 1
esacexit 0

转载于:https://www.cnblogs.com/fly-fish/archive/2011/08/25/2153886.html

linux驱动学习笔记(2.4) scull 脚本scull_init相关推荐

  1. Linux 驱动学习笔记 - beep(九)

    Linux 驱动学习笔记 - beep(九) 本系列均为正点原子 Linux 驱动的学习笔记, 以便加深笔者记忆.如读者想进一步学习,可以到正点原子官网中下载资料进行学习. 添加 pinctrl 节点 ...

  2. IMX6ULL嵌入式Linux驱动学习笔记(二)

    IMX6ULL嵌入式Linux驱动学习 一.字符设备驱动 二.驱动模块的加载与卸载 三.字符设备的注册与注销 四.设备号 五.file_operations的具体实现 六.字符设备驱动框架 七.编写应 ...

  3. Linux驱动学习笔记

    驱动学习笔记 1.字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序. 第二种就是将驱动编译成模块(Li ...

  4. 讯为4412开发板Linux驱动学习笔记

    驱动理论专题一 Linux驱动程序的基本认识 有了内存管理单元,就有虚拟地址,物理地址. 驱动理论专题二 学会查看原理图 以LED2为示例 通过原理图查看到KP_COL0,赋予高电平则能点亮LED2, ...

  5. linux驱动学习笔记(三)阻塞与非阻塞IO

    Linux驱动中阻塞与非阻塞IO 前言 阻塞 非阻塞 一.等待队列 1.等待队列头 2.等待队列 模板 二.轮询 模板 总结 前言 阻塞和非阻塞io是两种不同的设备访问方式. 阻塞 阻塞IO表示在执行 ...

  6. Linux驱动学习笔记之触摸屏驱动

    触摸屏归纳为输入子系统,这里主要是针对电阻屏,其使用过程如下 当用触摸笔按下时,产生中断. 在中断处理函数处理函数中启动ADC转换x,y坐标. ADC结束,产生ADC中断 在ADC中断处理函数里上报( ...

  7. Linux驱动学习笔记之并发控制

    Linux 设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态. 并发(concurrency)指的是多个执行单元同时.并行被执行,而并发的执行单元对共享资源(硬件资源和软 ...

  8. linux显示3个字符,Linux驱动学习笔记(3)字符设备驱动

    今天对程序进行编译,结果出现 make -C /lib/modules/3.3.2-6.fc16.x86_64/build M=/home/jqzeng/workSpace/ldd3/ldd3-sam ...

  9. Linux驱动学习笔记 -- 驱动总线实验

    驱动总线 在Linux系统中,除了硬件总线,还有一种软件虚拟出来的总线 – 驱动总线bus 这种驱动总线的作用:软件与硬件代码分离,提高程序的复用性 驱动总线分三个部分: 三者都是在/include/ ...

最新文章

  1. Camera HDR Algorithms
  2. LeetCode刷题记录9——58. Length of Last Word(easy)
  3. 核函数K(kernel function)
  4. GT Transceiver中的重要时钟及其关系(5)QPLL的工作原理介绍
  5. LeetCode Minimum Moves to Equal Array Elements II
  6. mybatis逆向工程生成的实体类和表不一致缺少某些字段或者出现其他字段
  7. 【阿里云北京峰会】一图看懂阿里云GPU实例如何帮助企业在AI应用赛道上加速...
  8. Java设计模式-工厂模式(3)抽象工厂模式
  9. 源码解析 Netty Channel接口及其实现类
  10. python编程单片机_Micro Python:用Python语言控制单片机
  11. 07-爬虫验证码破解实战
  12. cairo填充_Cairo 图形指南 (5) —— 形状与填充
  13. [AngularJS]--基本用法
  14. nero linux4 序列号,Nero Linux 4 Nero Linux v4.0.0.0b
  15. TikTok选品有什么技巧?
  16. Google 广告考试试题
  17. 怎么屏蔽还有照片_在朋友圈发男神照片没屏蔽父母,老妈的回应亮了
  18. 我,在日本开密室逃脱,钱还没赚,人进“橘子”了……
  19. solr引入mysql数据库数据,出现Requests: 1, Fetched: 0, Skipped: 0, Processed: 0
  20. 听说你想进大厂?当心这13个MySQL送命题!

热门文章

  1. docker 虚拟机搭建mongodb一主一从一复制_Docker最全教程——MongoDB容器化(十三)...
  2. ad16自动布线设置规则_Cadence的allegro下设置阻抗
  3. 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ③ ( 创建工程目录 | 添加 C++ 源代码 | 代码自动提示 )
  4. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | x(n) 分解为实部序列与虚部序列 | 实部傅里叶变换 | 虚部傅里叶变换 | 共轭对称傅里叶变换 | 共轭反对称傅里叶变换 )
  5. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
  6. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
  7. 【Windows 逆向】CheatEngine 工具 ( CheatEngine 简介 | 使用 Lazarus 编译 CE 源码 | CheatEngine 相关文档资料 )
  8. 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
  9. 【Flutter】Flutter Gallery 官方示例简介 ( 项目简介 | 工程构建 )
  10. Linux系统的基本命令