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

Linux设备驱动程序学习(6)

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

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

独享设备

最生硬的访问控制方式是只允许一个设备一次被一个进程打开(独享),这是一个设备驱动最简单的访问控制。实现十分简单,具体的代码看实验源码吧!

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模块改的,这要既可以实现功能,也方便测试。

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

阻塞型单用户访问[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 链表的知识(在第十一章),下一篇会介绍。

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版)》第六章高级字符驱动程序操作的学习终于结束了,内容比较多,碰到的问题也多。但是在解决问题的过程中可以学到很多的知识,所以有了问题不要马上问别人,试着自己看源码来发现问题,不仅记得牢,也学得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值