Linux设备驱动程式学习(6)-高级字符驱动程式操作[(3)设备文件的访问

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Linux设备驱动程式学习(6)-高级字符驱动程式操作[(3)设备文件的访问控制Linux设备驱动程式学习(6)-高级字符驱动程式操作[(3)设备文件的访问控制]提供访问控制对于一个设备节点来的可靠性来说有时是至关重要的。这部分的内容只是在open和release方法上做些修改,增加一些检查机制既可。独享设备最生硬的访问控制方式是只允许一个设备一次被一个进程打开(独享),这是个设备驱动最简单的访问控制。实现十分简单,具体的代码看实验源码吧!模块程式链接:scullsingle.tar.gz模块测试程式链接:scullsingle-test.tar.gzARM9实验板的实验现象是:[Tekkaman2440@SBC2440V4]#cd/lib/modules/[Tekkaman2440@SBC2440V4]#insmodscullsingle.ko[Tekkaman2440@SBC2440V4]#cat/proc/devicesCharacterdevices:1mem2pty3ttyp4/dev/vc/04tty4ttyS5/dev/tty5/dev/console5/dev/ptmx7vcs10misc13input14sound81video4linux89i2c90mtd116alsa128ptm136pts180usb189usb_device204s3c2410_serial252scullsingle253usb_endpoint254rtcBlockdevices:1ramdisk256rfd7loop31mtdblock93nftl96inftl179mmc[Tekkaman2440@SBC2440V4]#mknod-m666scullsinglec2520[Tekkaman2440@SBC2440V4]#cd/tmp/[Tekkaman2440@SBC2440V4]#./scullsingle-test&[Tekkaman2440@SBC2440V4]#openscullsingleisfile=3[Tekkaman2440@SBC2440V4]#echo12345/dev/scullsingle-sh:cannotcreate/dev/scullsingle:Deviceorresourcebusy[Tekkaman2440@SBC2440V4]#cat/dev/scullsinglecat:can’topen’/dev/scullsingle单用户访问open调用在第一次打开记住了设备拥有者,此用户可多次打开设备,并协调多个进程对设备并发操作。同时,没有其他用户可打开他,避免了外部干扰。这个模块我是利用completion模块改的,这要既能实现功能,也方便测试。模块程式链接:completion-singleUID.tar.gz模块测试程式链接:completion-singleUID-test.tar.gzARM9实验板的实验现象是:[Tekkaman2440@SBC2440V4]#insmod/lib/modules/singleUID.ko[Tekkaman2440@SBC2440V4]#cat/proc/devicesCharacterdevices:1mem2pty3ttyp4/dev/vc/04tty4ttyS5/dev/tty5/dev/console5/dev/ptmx7vcs10misc13input14sound81video4linux89i2c90mtd116alsa128ptm136pts180usb189usb_device204s3c2410_serial252singleUID253usb_endpoint254rtcBlockdevices:1ramdisk256rfd7loop31mtdblock93nftl96inftl179mmc[Tekkaman2440@SBC2440V4]#mknod-m666/dev/singleUIDc2520[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr&[Tekkaman2440@SBC2440V4]#logintekkamanPassword:Setsearchlibrarypathint/etc/profileSetuserpathin/etc/profileruning/etc/profileok[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwopensingleUIDcode=-1[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testropensingleUIDcode=-1[Tekkaman2440@SBC2440V4]#exit[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwwritecode=0[Tekkaman2440@SBC2440V4]#readcode=0[1]+Done/tmp/singleUID_testr阻塞型单用户访问模块程式链接:completion-singleUIDnb.tar.gz模块测试程式链接:completion-singleUIDnb-test.tar.gzARM9实验板的实验现象是:[Tekkaman2440@SBC2440V4]#insmod/lib/modules/singleUIDnb.ko[Tekkaman2440@SBC2440V4]#cat/proc/devicesCharacterdevices:1mem2pty3ttyp4/dev/vc/04tty4ttyS5/dev/tty5/dev/console5/dev/ptmx7vcs10misc13input14sound81video4linux89i2c90mtd116alsa128ptm136pts180usb189usb_device204s3c2410_serial252singleUIDnb253usb_endpoint254rtcBlockdevices:1ramdisk256rfd7loop31mtdblock93nftl96inftl179mmc[Tekkaman2440@SBC2440V4]#mknod-m666/dev/singleUIDnbc2520[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb&[Tekkaman2440@SBC2440V4]#logintekkamanPassword:Setsearchlibrarypathint/etc/profileSetuserpathin/etc/profileruning/etc/profileok[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb&[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb&[Tekkaman2440@SBC2440V4]#exit[Tekkaman2440@SBC2440V4]#psPIDUidVSZStatCommand1root1744Sinit2rootSW[kthreadd]3rootSWN[ksoftirqd/0]4rootSW[watchdog/0]5rootSW[events/0]6rootSW[khelper]59rootSW[kblockd/0]60rootSW[ksuspend_usbd]63rootSW[khubd]65rootSW[kseriod]77rootSW[pdflush]78rootSW[pdflush]79rootSW[kswapd0]80rootSW[aio/0]707rootSW[mtdblockd]708rootSW[nftld]709rootSW[inftld]710rootSW[rfdd]742rootSW[kpsmoused]751rootSW[kmmcd]769rootSW[rpciod/0]778root1752S-sh779root1744Sinit781root1744Sinit782root1744Sinit783root1744Sinit814root1336D/tmp/singleUID_testrnb816tekkaman1336S/tmp/singleUID_testrnb817tekkaman1336S/tmp/singleUID_testwnb818root1744Rps[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwnb&[Tekkaman2440@SBC2440V4]#readcode=0writecode=0writecode=0readcode=0[2]+Done/tmp/singleUID_testwnb[1]+Done/tmp/singleUID_testrnb[Tekkaman2440@SBC2440V4]#psPIDUidVSZStatCommand1root1744Sinit2rootSW[kthreadd]3rootSWN[ksoftirqd/0]4rootSW[watchdog/0]5rootSW[events/0]6rootSW[khelper]59rootSW[kblockd/0]60rootSW[ksuspend_usbd]63rootSW[khubd]65rootSW[kseriod]77rootSW[pdflush]78rootSW[pdflush]79rootSW[kswapd0]80rootSW[aio/0]707rootSW[mtdblockd]708rootSW[nftld]709rootSW[inftld]710rootSW[rfdd]742rootSW[kpsmoused]751rootSW[kmmcd]769rootSW[rpciod/0]778root1752S-sh779root1744Sinit781root1744Sinit782root1744Sinit783root1744Sinit820root1744Rps在open时复制设备访问控制的另一个技术是根据打开条件创建不同的设备私有副本。这只有当设备没有绑定到一个硬件实体时才有可能。/dev/tty的内部使用类似的技术来给他的进程一个不同的/dev入口点所呈现的“景象”。这类访问控制较少见,但这个实现可说明内核代码能轻松改动应用程式的运行环境,类似windows中的虚拟机概念。我将书中的例子作了修改,实现了不同的用户使用scull的不同私有副本,这样方便了在ARM9实验板上做测试。这个实验源码需要一定的linux链表的知识(在第十一章),下一篇会介绍。模块程式链接:scullcloned.tar.gzARM9实验板的实验现象是:[Tekkaman2440@SBC2440V4]#cd/lib/modules/[Tekkaman2440@SBC2440V4]#insmodscullcloned.ko[Tekkaman2440@SBC2440V4]#cat/proc/devicesCharacterdevices:1mem2pty3ttyp4/dev/vc/04tty4ttyS5/dev/tty5/dev/console5/dev/ptmx7vcs10misc13input14sound81video4linux89i2c90mtd116alsa128ptm136pts180usb189usb_device204s3c2410_serial252scullcloned253usb_endpoint254rtcBlockdevices:1ramdisk256rfd7loop31mtdblock93nftl96inftl179mmc[Tekkaman2440@SBC2440V4]#mknod-m666scullc

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功