模块程序链接:scullsingle.tar.gz<br /><br />模块测试程序链接:scullsingle-test.tar.gz<br /><br />ARM9实验板的实验现象是:<br /><br />[Tekkaman2440@SBC2440V4]#cd /lib/modules/<br />[Tekkaman2440@SBC2440V4]#insmod scullsingle.ko<br />[Tekkaman2440@SBC2440V4]#cat /proc/devices<br />Character devices:<br /> 1 mem<br /> 2 pty<br /> 3 ttyp<br /> 4 /dev/vc/0<br /> 4 tty<br /> 4 ttyS<br /> 5 /dev/tty<br /> 5 /dev/console<br /> 5 /dev/ptmx<br /> 7 vcs<br />10 misc<br />13 input<br />14 sound<br />81 video4linux<br />89 i2c<br />90 mtd<br />116 alsa<br />128 ptm<br />136 pts<br />180 usb<br />189 usb_device<br />204 s3c2410_serial<br />252 scullsingle<br />253 usb_endpoint<br />254 rtc<br /><br />Block devices:<br /> 1 ramdisk<br />256 rfd<br /> 7 loop<br />31 mtdblock<br />93 nftl<br />96 inftl<br />179 mmc<br />[Tekkaman2440@SBC2440V4]#mknod -m 666 scullsingle c 252 0<br />[Tekkaman2440@SBC2440V4]#cd /tmp/<br />[Tekkaman2440@SBC2440V4]#./scullsingle-test &<br />[Tekkaman2440@SBC2440V4]#open scullsingle is file=3<br />[Tekkaman2440@SBC2440V4]#echo 12345 > /dev/scullsingle<br />-sh: cannot create /dev/scullsingle: Device or resource busy<br />[Tekkaman2440@SBC2440V4]#cat /dev/scullsingle<br />cat: can't open '/dev/scullsingle<br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br />单用户访问 <br /><br />open 调用在第一次打开记住了设备拥有者,此用户可多次打开设备,并协调多个进程对设备并发操作。同时,没有其他用户可打开它,避免了外部干扰。这个模块我是利用completion模块改的,这要既可以实现功能,也方便测试。<br /><br />模块程序链接:completion-singleUID.tar.gz<br /><br />模块测试程序链接:completion-singleUID-test.tar.gz<br /><br />ARM9实验板的实验现象是:<br /><br />[Tekkaman2440@SBC2440V4]#insmod /lib/modules/singleUID.ko[Tekkaman2440@SBC2440V4]#cat /proc/devices<br />Character devices:<br /> 1 mem<br /> 2 pty<br /> 3 ttyp<br /> 4 /dev/vc/0<br /> 4 tty<br /> 4 ttyS<br /> 5 /dev/tty<br /> 5 /dev/console<br /> 5 /dev/ptmx<br /> 7 vcs<br />10 misc<br />13 input<br />14 sound<br />81 video4linux<br />89 i2c<br />90 mtd<br />116 alsa<br />128 ptm<br />136 pts<br />180 usb<br />189 usb_device<br />204 s3c2410_serial<br />252 singleUID<br />253 usb_endpoint<br />254 rtc<br /><br />Block devices:<br /> 1 ramdisk<br />256 rfd<br /> 7 loop<br />31 mtdblock<br />93 nftl<br />96 inftl<br />179 mmc<br />[Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUID c 252 0<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr&<br />[Tekkaman2440@SBC2440V4]#login tekkaman<br />Password:<br />Set search library path int /etc/profile<br />Set user path in /etc/profile<br />runing /etc/profile ok<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testw<br />open singleUID code=-1<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr<br />open singleUID code=-1<br />[Tekkaman2440@SBC2440V4]#exit<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testw<br />write code=0<br />[Tekkaman2440@SBC2440V4]#read code=0<br /><br />[1] + Done /tmp/singleUID_testr<br /><br /><br />阻塞型单用户访问<br /><br />模块程序链接:completion-singleUIDnb.tar.gz<br /><br />模块测试程序链接:completion-singleUIDnb-test.tar.gz<br /><br />ARM9实验板的实验现象是:<br /><br />[Tekkaman2440@SBC2440V4]#insmod /lib/modules/singleUIDnb.ko<br />[Tekkaman2440@SBC2440V4]#cat /proc/devices<br />Character devices:<br /> 1 mem<br /> 2 pty<br /> 3 ttyp<br /> 4 /dev/vc/0<br /> 4 tty<br /> 4 ttyS<br /> 5 /dev/tty<br /> 5 /dev/console<br /> 5 /dev/ptmx<br /> 7 vcs<br />10 misc<br />13 input<br />14 sound<br />81 video4linux<br />89 i2c<br />90 mtd<br />116 alsa<br />128 ptm<br />136 pts<br />180 usb<br />189 usb_device<br />204 s3c2410_serial<br />252 singleUIDnb<br />253 usb_endpoint<br />254 rtc<br /><br />Block devices:<br /> 1 ramdisk<br />256 rfd<br /> 7 loop<br />31 mtdblock<br />93 nftl<br />96 inftl<br />179 mmc<br />[Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUIDnb c 252 0<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb&<br />[Tekkaman2440@SBC2440V4]#login tekkaman<br />Password:<br />Set search library path int /etc/profile<br />Set user path in /etc/profile<br />runing /etc/profile ok<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb &<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb &<br />[Tekkaman2440@SBC2440V4]#exit<br />[Tekkaman2440@SBC2440V4]#ps<br /> PID Uid VSZ Stat Command<br /> 1 root 1744 S init<br /> 2 root SW< [kthreadd]<br /> 3 root SWN [ksoftirqd/0]<br /> 4 root SW< [watchdog/0]<br /> 5 root SW< [events/0]<br /> 6 root SW< [khelper]<br /> 59 root SW< [kblockd/0]<br /> 60 root SW< [ksuspend_usbd]<br /> 63 root SW< [khubd]<br /> 65 root SW< [kseriod]<br /> 77 root SW [pdflush]<br /> 78 root SW [pdflush]<br /> 79 root SW< [kswapd0]<br /> 80 root SW< [aio/0]<br /> 707 root SW< [mtdblockd]<br /> 708 root SW< [nftld]<br /> 709 root SW< [inftld]<br /> 710 root SW< [rfdd]<br /> 742 root SW< [kpsmoused]<br /> 751 root SW< [kmmcd]<br /> 769 root SW< [rpciod/0]<br /> 778 root 1752 S -sh<br /> 779 root 1744 S init<br /> 781 root 1744 S init<br /> 782 root 1744 S init<br /> 783 root 1744 S init<br /> 814 root 1336 D /tmp/singleUID_testrnb<br /> 816 tekkaman 1336 S /tmp/singleUID_testrnb<br /> 817 tekkaman 1336 S /tmp/singleUID_testwnb<br /> 818 root 1744 R ps<br />[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb&<br />[Tekkaman2440@SBC2440V4]#read code=0<br />write code=0<br />write code=0<br />read code=0<br /><br />[2] + Done /tmp/singleUID_testwnb<br />[1] + Done /tmp/singleUID_testrnb<br />[Tekkaman2440@SBC2440V4]#ps<br /> PID Uid VSZ Stat Command<br /> 1 root 1744 S init<br /> 2 root SW< [kthreadd]<br /> 3 root SWN [ksoftirqd/0]<br /> 4 root SW< [watchdog/0]<br /> 5 root SW< [events/0]<br /> 6 root SW< [khelper]<br /> 59 root SW< [kblockd/0]<br /> 60 root SW< [ksuspend_usbd]<br /> 63 root SW< [khubd]<br /> 65 root SW< [kseriod]<br /> 77 root SW [pdflush]<br /> 78 root SW [pdflush]<br /> 79 root SW< [kswapd0]<br /> 80 root SW< [aio/0]<br /> 707 root SW< [mtdblockd]<br /> 708 root SW< [nftld]<br /> 709 root SW< [inftld]<br /> 710 root SW< [rfdd]<br /> 742 root SW< [kpsmoused]<br /> 751 root SW< [kmmcd]<br /> 769 root SW< [rpciod/0]<br /> 778 root 1752 S -sh<br /> 779 root 1744 S init<br /> 781 root 1744 S init<br /> 782 root 1744 S init<br /> 783 root 1744 S init<br /> 820 root 1744 R ps<br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />在 open 时复制设备<br /><br />访问控制的另一个技术是根据打开条件创建不同的设备私有副本。这只有当设备没有绑定到一个硬件实体时才有可能。 /dev/tty 的内部使用类似的技术来给它的进程一个不同的 /dev 入口点所呈现的“景象”。这类访问控制较少见,但这个实现可说明内核代码可以轻松改变应用程序的运行环境,类似windows中的虚拟机概念。<br /><br />我将书中的例子作了修改,实现了不同的用户使用scull的不同私有副本,这样方便了在ARM9实验板上做测试。<br />这个实验源码需要一定的linux 链表的知识(在第十一章),下一篇会介绍。<br />模块程序链接:scullcloned.tar.gz<br /><br />ARM9实验板的实验现象是:<br /><br />[Tekkaman2440@SBC2440V4]#cd /lib/modules/<br />[Tekkaman2440@SBC2440V4]#insmod scullcloned.ko<br />[Tekkaman2440@SBC2440V4]#cat /proc/devices<br />Character devices:<br /> 1 mem<br /> 2 pty<br /> 3 ttyp<br /> 4 /dev/vc/0<br /> 4 tty<br /> 4 ttyS<br /> 5 /dev/tty<br /> 5 /dev/console<br /> 5 /dev/ptmx<br /> 7 vcs<br />10 misc<br />13 input<br />14 sound<br />81 video4linux<br />89 i2c<br />90 mtd<br />116 alsa<br />128 ptm<br />136 pts<br />180 usb<br />189 usb_device<br />204 s3c2410_serial<br />252 scullcloned<br />253 usb_endpoint<br />254 rtc<br /><br />Block devices:<br /> 1 ramdisk<br />256 rfd<br /> 7 loop<br />31 mtdblock<br />93 nftl<br />96 inftl<br />179 mmc<br />[Tekkaman2440@SBC2440V4]#mknod -m 666 scullcloned c 252 0<br />[Tekkaman2440@SBC2440V4]#echo root > /dev/scullcloned<br />[Tekkaman2440@SBC2440V4]#cat /dev/scullcloned<br />root<br />[Tekkaman2440@SBC2440V4]#login tekkaman<br />Password:<br />Set search library path int /etc/profile<br />Set user path in /etc/profile<br />runing /etc/profile ok<br />[Tekkaman2440@SBC2440V4]#cat /dev/scullcloned<br />[Tekkaman2440@SBC2440V4]#echo tekkaman >/dev/scullcloned<br />[Tekkaman2440@SBC2440V4]#cat /dev/scullcloned<br />tekkaman<br />[Tekkaman2440@SBC2440V4]#exit<br />[Tekkaman2440@SBC2440V4]#cat /dev/scullcloned<br />root<br /> |
|