提供存取控制對於一個裝置節點來的可靠性來說有時是至關重要的。這部分的內容只是在open和release方法上做些修改,增加一些檢查機制既可。
獨享裝置
最生硬的存取控制方式是只允許一個裝置一次被一個進程開啟(獨享),這是一個裝置驅動最簡單的存取控制。實現十分簡單,具體的代碼看實驗源碼吧!模組程式連結:
scullsingle.tar.gz模組測試程式連結:
scullsingle-test.tar.gzARM9實驗板的實驗現象是:
[Tekkaman2440@SBC2440V4]#cd /lib/modules/[Tekkaman2440@SBC2440V4]#insmod scullsingle.ko[Tekkaman2440@SBC2440V4]#cat /proc/devicesCharacter 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 mtd116 alsa128 ptm136 pts180 usb189 usb_device204 s3c2410_serial252 scullsingle253 usb_endpoint254 rtcBlock devices: 1 ramdisk256 rfd 7 loop 31 mtdblock 93 nftl 96 inftl179 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/scullsinglecat: can't open '/dev/scullsingle
單使用者訪問
open 調用在第一次開啟記住了裝置擁有者,此使用者可多次開啟裝置,並協調多個進程對裝置並行作業。同時,沒有其他使用者可開啟它,避免了外部幹擾。這個模組我是利用completion模組改的,這要既可以實現功能,也方便測試。模組程式連結:
completion-singleUID.tar.gz模組測試程式連結:
completion-singleUID-test.tar.gzARM9實驗板的實驗現象是:
[Tekkaman2440@SBC2440V4]#insmod /lib/modules/singleUID.ko[Tekkaman2440@SBC2440V4]#cat /proc/devicesCharacter 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 mtd116 alsa128 ptm136 pts180 usb189 usb_device204 s3c2410_serial252 singleUID253 usb_endpoint254 rtcBlock devices: 1 ramdisk256 rfd 7 loop 31 mtdblock 93 nftl 96 inftl179 mmc[Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUID c 252 0[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testr&[Tekkaman2440@SBC2440V4]#login tekkamanPassword:Set search library path int /etc/profileSet user path in /etc/profileruning /etc/profile ok[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwopen singleUID code=-1[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testropen singleUID code=-1[Tekkaman2440@SBC2440V4]#exit[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testwwrite code=0[Tekkaman2440@SBC2440V4]#read code=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/devicesCharacter 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 mtd116 alsa128 ptm136 pts180 usb189 usb_device204 s3c2410_serial252 singleUIDnb253 usb_endpoint254 rtcBlock devices: 1 ramdisk256 rfd 7 loop 31 mtdblock 93 nftl 96 inftl179 mmc[Tekkaman2440@SBC2440V4]#mknod -m 666 /dev/singleUIDnb c 252 0[Tekkaman2440@SBC2440V4]#/tmp/singleUID_testrnb&[Tekkaman2440@SBC2440V4]#login tekkamanPassword:Set search library path int /etc/profileSet user path in /etc/profileruning /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=0write code=0write code=0read 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 鏈表的知識(在第十一章),下一篇會介紹。模組程式連結:
scullcloned.tar.gzARM9實驗板的實驗現象是:
[Tekkaman2440@SBC2440V4]#cd /lib/modules/[Tekkaman2440@SBC2440V4]#insmod scullcloned.ko[Tekkaman2440@SBC2440V4]#cat /proc/devicesCharacter 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 mtd116 alsa128 ptm136 pts180 usb189 usb_device204 s3c2410_serial252 scullcloned253 usb_endpoint254 rtcBlock devices: 1 ramdisk256 rfd 7 loop 31 mtdblock 93 nftl 96 inftl179 mmc[Tekkaman2440@SBC2440V4]#mknod -m 666 scullcloned c 252 0[Tekkaman2440@SBC2440V4]#echo root > /dev/scullcloned[Tekkaman2440@SBC2440V4]#cat /dev/scullclonedroot[Tekkaman2440@SBC2440V4]#login tekkamanPassword:Set search library path int /etc/profileSet user path in /etc/profileruning /etc/profile ok[Tekkaman2440@SBC2440V4]#cat /dev/scullcloned[Tekkaman2440@SBC2440V4]#echo tekkaman >/dev/scullcloned[Tekkaman2440@SBC2440V4]#cat /dev/scullclonedtekkaman[Tekkaman2440@SBC2440V4]#exit[Tekkaman2440@SBC2440V4]#cat /dev/scullclonedroot
《Linux裝置驅動程式(第3版)》第六章進階字元驅動程式操作的學習終於結束了,內容比較多,碰到的問題也多。但是在解決問題的過程中可以學到很多的知識,所以有了問題不要馬上問別人,試著自己看源碼來發現問題,不僅記得牢,也學得多。