Linux裝置驅動程式學習(6) -進階字元驅動程式操作[(3)裝置檔案的存取控制]

來源:互聯網
上載者:User
提供存取控制對於一個裝置節點來的可靠性來說有時是至關重要的。這部分的內容只是在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版)》第六章進階字元驅動程式操作的學習終於結束了,內容比較多,碰到的問題也多。但是在解決問題的過程中可以學到很多的知識,所以有了問題不要馬上問別人,試著自己看源碼來發現問題,不僅記得牢,也學得多。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.