Linux设备驱动程序学习(6)
来源:互联网 发布:python 新浪期货数据 编辑:程序博客网 时间:2024/06/05 04:20
独享设备
最生硬的访问控制方式是只允许一个设备一次被一个进程打开(独享),这是一个设备驱动最简单的访问控制。实现十分简单,具体的代码看实验源码吧!
模块程序链接: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
[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中的虚拟机概念。
模块程序链接: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版)》第六章高级字符驱动程序操作的学习终于结束了,内容比较多,碰到的问题也多。但是在解决问题的过程中可以学到很多的知识,所以有了问题不要马上问别人,试着自己看源码来发现问题,不仅记得牢,也学得多。
模块测试程序链接:completion-singleUID-test.tar.gz
ARM9实验板的实验现象是:
- Linux设备驱动程序学习(6)
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(3)-字符设备驱动程序
- Linux设备驱动程序学习(1) -字符设备驱动程序
- Linux设备驱动程序学习
- Linux设备驱动程序学习
- Linux设备驱动程序学习
- Linux设备驱动程序学习
- linux设备驱动程序学习
- Linux设备驱动程序学习(0)
- Linux设备驱动程序学习(1)
- Linux设备驱动程序学习(4)
- Linux设备驱动程序学习(5)
- Linux设备驱动程序学习(10)
- VC调试技术
- struts.xml文件结构
- Linux设备驱动程序学习(5)
- 单步执行命令step into/step out/step over的区别
- (转)显式加载DLL并使用 DLL 中的类
- Linux设备驱动程序学习(6)
- 简介Java 克隆
- Advanced Windows Debugging (Paperback), Nov.2007.eBook-BBL
- 用.NET开发MSN聊天机器人 - MSN聊天机器人开发揭秘
- Linux设备驱动程序学习(7)-内核的数据类型
- Cross-Platform Development in C++: Building Mac OS X, Linux, and, Windows Applications (Paperback) Dec.2007.eBook-BBL
- .NET生成静态页面并分页
- Linux设备驱动程序学习(8)-分配内存
- Building a Data Warehouse: With Examples in SQL Server (Hardcover), Dec.2007.eBook-BBL