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

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

感觉就是挺深的,有点摸不透了!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部