• Linux设备驱动程序学习(6) 高级字符驱动程序操作[(3)设备文件的访问控制]


    提供访问控制对于一个设备节点来的可靠性来说有时是至关重要的。这部分的内容只是在open和release方法上做些修改,增加一些检查机制既可。

    独享设备
    最生硬的访问控制方式是只允许一个设备一次被一个进程打开(独享),这是一个设备驱动最简单的访问控制。实现十分简单,具体的代码看实验源码吧!
    模块程序链接:scullsingle.tar.gz
    模块测试程序链接:scullsingle-test.tar.gz
    ARM9实验板的实验现象是:
    [Tekkaman2440@SBC2440V4]#cd /lib/modules/
    [Tekkaman2440@SBC2440V4]#insmod scullsingle.ko
    [Tekkaman2440@SBC2440V4]#cat /proc/devices
    Character devices:
      1 mem
      2 pty
      3 ttyp
      4 /dev/vc/0
      4 tty
      4 ttyS
      5 /dev/tty
      5 /dev/console
      5 /dev/ptmx
      7 vcs
     10 misc
     13 input
     14 sound
     81 video4linux
     89 i2c
     90 mtd
    116 alsa
    128 ptm
    136 pts
    180 usb
    189 usb_device
    204 s3c2410_serial
    252 scullsingle
    253 usb_endpoint
    254 rtc
    Block devices:
      1 ramdisk
    256 rfd
      7 loop
     31 mtdblock
     93 nftl
     96 inftl
    179 mmc
    [Tekkaman2440@SBC2440V4]#mknod -m 666 scullsingle c 252 0
    [Tekkaman2440@SBC2440V4]#cd /tmp/
    [Tekkaman2440@SBC2440V4]#./scullsingle-test &
    [Tekkaman2440@SBC2440V4]#open scullsingle is file=3
    [Tekkaman2440@SBC2440V4]#echo 12345 > /dev/scullsingle
    -sh: cannot create /dev/scullsingle: Device or resource busy
    [Tekkaman2440@SBC2440V4]#cat /dev/scullsingle
    cat: can't open '/dev/scullsingle

    单用户访问
    open 调用在第一次打开记住了设备拥有者,此用户可多次打开设备,并协调多个进程对设备并发操作。同时,没有其他用户可打开它,避免了外部干扰。这个模块我是利用completion模块改的,这要既可以实现功能,也方便测试。
    模块程序链接:completion-singleUID.tar.gz
    模块测试程序链接:completion-singleUID-test.tar.gz
    ARM9实验板的实验现象是:
    [Tekkaman2440@SBC2440V4]#insmod /lib/modules/singleUID.ko[Tekkaman2440@SBC2440V4]#cat /proc/devices
    Character devices:
      1 mem
      2 pty
      3 ttyp
      4 /dev/vc/0
      4 tty
      4 ttyS
      5 /dev/tty
      5 /dev/console
      5 /dev/ptmx
      7 vcs
     10 misc
     13 input
     14 sound
     81 video4linux
     89 i2c
     90 mtd
    116 alsa
    128 ptm
    136 pts
    180 usb
    189 usb_device
    204 s3c2410_serial
    252 singleUID
    253 usb_endpoint
    254 rtc
    Block devices:
      1 ramdisk
    256 rfd
      7 loop
     31 mtdblock
     93 nftl
     96 inftl
    179 mmc
    [Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUID c 252 0
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr&
    [Tekkaman2440@SBC2440V4]#login tekkaman
    Password:
    Set search library path int /etc/profile
    Set user path in /etc/profile
    runing /etc/profile ok
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testw
    open singleUID code=-1
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr
    open singleUID code=-1
    [Tekkaman2440@SBC2440V4]#exit
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testw
    write code=0
    [Tekkaman2440@SBC2440V4]#read code=0
    [1] + Done /tmp/singleUID_testr
    阻塞型单用户访问
    模块程序链接:completion-singleUIDnb.tar.gz
    模块测试程序链接:completion-singleUIDnb-test.tar.gz
    ARM9实验板的实验现象是:
    [Tekkaman2440@SBC2440V4]#insmod /lib/modules/singleUIDnb.ko
    [Tekkaman2440@SBC2440V4]#cat /proc/devices
    Character devices:
      1 mem
      2 pty
      3 ttyp
      4 /dev/vc/0
      4 tty
      4 ttyS
      5 /dev/tty
      5 /dev/console
      5 /dev/ptmx
      7 vcs
     10 misc
     13 input
     14 sound
     81 video4linux
     89 i2c
     90 mtd
    116 alsa
    128 ptm
    136 pts
    180 usb
    189 usb_device
    204 s3c2410_serial
    252 singleUIDnb
    253 usb_endpoint
    254 rtc
    Block devices:
      1 ramdisk
    256 rfd
      7 loop
     31 mtdblock
     93 nftl
     96 inftl
    179 mmc
    [Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUIDnb c 252 0
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb&
    [Tekkaman2440@SBC2440V4]#login tekkaman
    Password:
    Set search library path int /etc/profile
    Set user path in /etc/profile
    runing /etc/profile ok
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb &
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb &
    [Tekkaman2440@SBC2440V4]#exit
    [Tekkaman2440@SBC2440V4]#ps
      PID Uid VSZ Stat Command
        1 root 1744 S init
        2 root SW< [kthreadd]
        3 root SWN [ksoftirqd/0]
        4 root SW< [watchdog/0]
        5 root SW< [events/0]
        6 root SW< [khelper]
       59 root SW< [kblockd/0]
       60 root SW< [ksuspend_usbd]
       63 root SW< [khubd]
       65 root SW< [kseriod]
       77 root SW [pdflush]
       78 root SW [pdflush]
       79 root SW< [kswapd0]
       80 root SW< [aio/0]
      707 root SW< [mtdblockd]
      708 root SW< [nftld]
      709 root SW< [inftld]
      710 root SW< [rfdd]
      742 root SW< [kpsmoused]
      751 root SW< [kmmcd]
      769 root SW< [rpciod/0]
      778 root 1752 S -sh
      779 root 1744 S init
      781 root 1744 S init
      782 root 1744 S init
      783 root 1744 S init
      814 root 1336 D /tmp/singleUID_testrnb
      816 tekkaman 1336 S /tmp/singleUID_testrnb
      817 tekkaman 1336 S /tmp/singleUID_testwnb
      818 root 1744 R ps
    [Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb&
    [Tekkaman2440@SBC2440V4]#read code=0
    write code=0
    write code=0
    read code=0
    [2] + Done /tmp/singleUID_testwnb
    [1] + Done /tmp/singleUID_testrnb
    [Tekkaman2440@SBC2440V4]#ps
      PID Uid VSZ Stat Command
        1 root 1744 S init
        2 root SW< [kthreadd]
        3 root SWN [ksoftirqd/0]
        4 root SW< [watchdog/0]
        5 root SW< [events/0]
        6 root SW< [khelper]
       59 root SW< [kblockd/0]
       60 root SW< [ksuspend_usbd]
       63 root SW< [khubd]
       65 root SW< [kseriod]
       77 root SW [pdflush]
       78 root SW [pdflush]
       79 root SW< [kswapd0]
       80 root SW< [aio/0]
      707 root SW< [mtdblockd]
      708 root SW< [nftld]
      709 root SW< [inftld]
      710 root SW< [rfdd]
      742 root SW< [kpsmoused]
      751 root SW< [kmmcd]
      769 root SW< [rpciod/0]
      778 root 1752 S -sh
      779 root 1744 S init
      781 root 1744 S init
      782 root 1744 S init
      783 root 1744 S init
      820 root 1744 R ps

    在 open 时复制设备
    访问控制的另一个技术是根据打开条件创建不同的设备私有副本。这只有当设备没有绑定到一个硬件实体时才有可能。 /dev/tty 的内部使用类似的技术来给它的进程一个不同的 /dev 入口点所呈现的“景象”。这类访问控制较少见,但这个实现可说明内核代码可以轻松改变应用程序的运行环境,类似windows中的虚拟机概念。
    我将书中的例子作了修改,实现了不同的用户使用scull的不同私有副本,这样方便了在ARM9实验板上做测试。
    这个实验源码需要一定的linux 链表的知识(在第十一章),下一篇会介绍。
    模块程序链接:scullcloned.tar.gz
    ARM9实验板的实验现象是:
    [Tekkaman2440@SBC2440V4]#cd /lib/modules/
    [Tekkaman2440@SBC2440V4]#insmod scullcloned.ko
    [Tekkaman2440@SBC2440V4]#cat /proc/devices
    Character devices:
      1 mem
      2 pty
      3 ttyp
      4 /dev/vc/0
      4 tty
      4 ttyS
      5 /dev/tty
      5 /dev/console
      5 /dev/ptmx
      7 vcs
     10 misc
     13 input
     14 sound
     81 video4linux
     89 i2c
     90 mtd
    116 alsa
    128 ptm
    136 pts
    180 usb
    189 usb_device
    204 s3c2410_serial
    252 scullcloned
    253 usb_endpoint
    254 rtc
    Block devices:
      1 ramdisk
    256 rfd
      7 loop
     31 mtdblock
     93 nftl
     96 inftl
    179 mmc
    [Tekkaman2440@SBC2440V4]#mknod -m 666 scullcloned c 252 0
    [Tekkaman2440@SBC2440V4]#echo root > /dev/scullcloned
    [Tekkaman2440@SBC2440V4]#cat /dev/scullcloned
    root
    [Tekkaman2440@SBC2440V4]#login tekkaman
    Password:
    Set search library path int /etc/profile
    Set user path in /etc/profile
    runing /etc/profile ok
    [Tekkaman2440@SBC2440V4]#cat /dev/scullcloned
    [Tekkaman2440@SBC2440V4]#echo tekkaman >/dev/scullcloned
    [Tekkaman2440@SBC2440V4]#cat /dev/scullcloned
    tekkaman
    [Tekkaman2440@SBC2440V4]#exit
    [Tekkaman2440@SBC2440V4]#cat /dev/scullcloned
    root
    《Linux设备驱动程序(第3版)》第六章高级字符驱动程序操作的学习终于结束了,内容比较多,碰到的问题也多。但是在解决问题的过程中可以学到很多的知识,所以有了问题不要马上问别人,试着自己看源码来发现问题,不仅记得牢,也学得多。
  • 相关阅读:
    java 根据对象属性排序
    无法初始化SFTP协议。主机是SFTP服务器吗
    Spring IOC 学习(三)IOC容器的依赖注入
    Spring-IOC学习-02 IOC容器初始化
    nginx简单使用
    Spring-IOC学习-01 IOC重要的几个接口定义
    Spring-IOC学习
    Http Service
    C#从入门到放弃--字符串类型转数字类型
    VS系列--快捷键的使用
  • 原文地址:https://www.cnblogs.com/shenhaocn/p/1996882.html
Copyright © 2020-2023  润新知