• 慢慢学Linux驱动开发,第七篇,scull的使用


            刚刚make好scull,非常的兴奋,立即使用了一下,本想总结在写一篇文章,不够偶尔发现了一篇很不错的文章,于是就转载过来,偷偷懒,不自己写了,嘿嘿。

    By: 吴垠

    1. 写在前面:
    a.
    在进行下面的工作之前请先阅读我 的文章 《在 Linux 2.6内核下编译可以加载的内核模块》 ,配 置好可加载内核模块的Linux环境
    b.
    下载《Linux设备设备驱动程序(第三版)》配套的源代 码,在这里 可 以下载到,如果无法下载的话可以留言 或者给我发邮件索取。
    c.
    本文的工作环境是Fedora Core 5,用“uname -r”查看内核版本是:2.6.15-1.2054_FC5
    d.
    本文主要针对的是《Linux设备设备驱动程序(第三 版)》中第三章:字符设备驱动程序
    e.
    下文的有些操作需要root权限,所以请尽量用root用 户来执行命令。

    2. 源代码包解压后进入scull文件夹,其中的文件有:
    access.c

    main.c
    主程序,scull设备的初始化、卸载、open、 write等实现都在这里面。
    Makefile

    pipe.c 第六章《高级字符驱动程序操作》会用到,用来讲解阻塞型设 备。
    scull.h
    头文件
    scull.init

    scull_load
    加载scull模块的脚本
    scull_unload 
    卸载scull模块的脚本

    3. 直接在scull目录下运行make命令就可以编译通过,会生成一个叫scull.ko的文件,然后运行脚本 scull_load, 没有任何输出就返回了,scull设备就会自动加载到内核当中去了,此时可以通过查看/proc/devices文件找到刚加载的scull模块,还有内 核为其分配的主设备号。
    在/dev/中也增加很多以scull开头的字符设备。
    4.
    试试scull设备:
    运行命令:
    # ls -l > /dev/scull  # 没有任何输出就返回了
    # cat /dev/scull     # 再运行cat命令读取scull设备,则会将上面命令的输出信息读出来
    总计 900
    -rw-rw-rw- 1 baobaowu baobaowu 10845 2005-02-01 access.c
    -rw-rw-r-- 1 baobaowu baobaowu 74580 06-15 16:27 access.o
    -rw-rw-rw- 1 baobaowu baobaowu 16631 06-15 17:15 main.c
    -rw-r--r-- 1 baobaowu baobaowu 74512 06-15 17:16 main.o
    -rw-r--r-- 1 baobaowu baobaowu 752 2005-02-01 Makefile
    -rw-rw-rw- 1 baobaowu baobaowu 11138 2005-02-01 pipe.c
    -rw-rw-r-- 1 baobaowu baobaowu 71576 06-15 16:27 pipe.o
    -rw-r--r-- 1 baobaowu baobaowu 5153 2005-02-01 scull.h
    -rwxr-xr-x 1 baobaowu baobaowu 3309 2005-02-01 scull.init
    -rw-r--r-- 1 baobaowu baobaowu 248556 06-15 17:16 scull.ko
    -rwxr-xr-x 1 baobaowu baobaowu 1708 06-15 16:34 scull_load
    -rw-rw-rw- 1 baobaowu baobaowu 1852 06-15 17:16 scull.mod.c
    -rw-r--r-- 1 baobaowu baobaowu 33696 06-15 17:16 scull.mod.o
    -rw-r--r-- 1 baobaowu baobaowu 216043 06-15 17:16 scull.o
    -rwxr-xr-x 1 baobaowu baobaowu 335 2005-02-01 scull_unload
    果然scull设备跟书中介绍的一样,只是存在于内存中的一个缓冲区。
    5. 再运行scull_unload,也是没有任何输出就返回了,但是scull模块却已经从内核中删除了,/proc/devices 文件中也没scull设备了,/dev/中也没有以scull开头的字符设备了。
    6. 下面在scull增加一些调试信息:
    打开main.c文件,在函数scull_init_module()的头部增加一句:
    printk(KERN_ALERT "Debug by baobaowu:scull_init_module()/n");
    在函数scull_read()的头部增加一句:
    printk(KERN_ALERT "Debug by baobaowu:scull_read()/n");
    在函数scull_write()的头部增加一句:
    printk(KERN_ALERT "Debug by baobaowu:scull_write()/n");
    保存后运行make进行编译。
    7. 重复第3步,将scull加载进内核中,此时内核应该调用main.c中的scull_init_module()函数,是不是调用 了呢?我们看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
    Debug by baobaowu:scull_init_module()
    那read和write怎么调用呢?我们紧接着下面介绍。
    8. 可以想像,向设备中写数据就会调用scull_write()函数,我们执行下面的命令利用输出重定向来向/dev/scull设备 写数据:
    # ls -l > /dev/scull
    执行完命令后再看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
    Debug by baobaowu:scull_write()

    9. 从设备中读取数据应该就会调用scull_read()函数,我们利用dd命令来读scull设备:
    # dd if=/dev/scull of=temp  # 从/dev/scull中读取数据,保存在当前目录下的temp文件中
    执行完命令后再看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
    Debug by baobaowu:scull_read()

    10. 本文介绍的scull使用方法调试成功后对读第三章《字符设备驱动程序》很有帮助,当遇到不懂,或不确定的地方时printk一下就 好了^_^


  • 相关阅读:
    springboot日志框架
    springboot创建一个可执行的jar
    springboot整合Thymeleaf模板引擎
    springboot自定义SpringApplication启动类
    springboot配置mybatis的mapper路径
    使用@SpringBootApplication注解
    HDU1269 迷宫城堡 —— 强连通分量
    POJ3177 Redundant Paths —— 边双联通分量 + 缩点
    HDU3394 Railway —— 点双联通分量 + 桥(割边)
    UVA796 Critical Links —— 割边(桥)
  • 原文地址:https://www.cnblogs.com/pang123hui/p/2309881.html
Copyright © 2020-2023  润新知