裝置驅動程式學習筆記 6 裝置訪問控制

2021-04-28 23:15:09 字數 3183 閱讀 9339

by:

潘雲登

對於商業目的下對本文的任何行為需經作者同意。

寫在前面

1.本文內容對應《

linux

裝置驅動程式》第六章。 2.

修改scull_load

指令碼中的

mode

為「666

」,使普通使用者具有裝置讀寫許可權。 3.

希望本文對您有所幫助,也歡迎您給我提意見和建議。

這裡描述的裝置訪問控制是在檔案系統許可位機制之下的特定裝置訪問策略,只與驅動程式的實現相關,而與核心無關。

進入ldd3

原始碼的scull

目錄,執行

make

編譯模組,並呼叫

scull_load

指令碼載入模組,以及在

/dev

目錄下建立裝置檔案。它們分別是

scullsingl

e、sculluid、scullwuid和scullpriv。

獨享裝置

這是最生硬的訪問控制方法,一次只允許乙個程序開啟裝置。驅動程式通過維護乙個原子變數,用以標識裝置是否已經開啟。當程序已被乙個程序獨享時,

open

方法返回

-ebusy

,提示裝置已經被程序使用。

利用tail –f

命令顯示裝置檔案,它呼叫驅動程式的

open

方法,而不執行

release

釋放裝置。

pydeng@pydeng-laptop:~$ tail -f /dev/scullsingle

開啟另外乙個終端,用

cat訪問同乙個裝置,提示裝置正忙。

pydeng@pydeng-laptop:~$ cat /dev/scullsingle

cat: /dev/scullsingle: device or resource busy

限制每次只有乙個使用者訪問裝置

該策略允許單個使用者在多個程序中開啟裝置,但是每次只允許乙個使用者開啟裝置。驅動程式需要維護兩個資料項,乙個用於開啟計數,乙個記錄裝置屬主的

uid。這些資料項通常應該儲存在裝置結構內部。當程序開啟裝置時,驅動程式通過程序結構中的

uid進行訪問控制,如

current->uid

。現在來測試一下

sculluid

裝置,感受這種訪問控制的效果。首先,以

pydeng

使用者保持裝置的開啟狀態。

pydeng@pydeng-laptop:/etc$ tail -f /dev/sculluid

在另外乙個終端中,以

cying

使用者訪問裝置,結果提示裝置正忙。

cying@pydeng-laptop:~$ cat /dev/sculluid

cat: /dev/sculluid: device or resource busy

這時,用

su切換回

pydeng

使用者,則可以成功開啟裝置,並進行正常讀寫。

cying@pydeng-laptop:~$ su pydeng

pydeng@pydeng-laptop:/# ls > /dev/sculluid

pydeng@pydeng-laptop:/# cat /dev/sculluid

binboot

cdrom

devetc

...

阻塞型開啟裝置

當裝置不能訪問裝置時返回

-ebusy

(5)-

休眠與喚醒》。

首先,用相同的方式,以

pydeng

使用者保持裝置的開啟狀態。

pydeng@pydeng-laptop:/etc$ tail -f /dev/scullwuid

在另外乙個終端中,以

cying

使用者訪問裝置,結果並未提示「

device or resource busy

」。可以看到,終端中游標在閃爍,程序進入休眠。

cying@pydeng-laptop:/$ ls / > /dev/scullwuid _

用ctrl+c

結束pydeng

使用者的tail

程序。這時,剛才休眠的程序成功返回,並成功地對裝置進行了寫操作。

cying@pydeng-laptop:/$ cat /dev/scullwuid

binboot

cdrom

devetc

...

在開啟時複製裝置

另乙個實現裝置訪問控制的方法是,在程序開啟裝置時建立裝置的不同私有副本。這種方法只有在裝置沒有繫結到某個硬體物件時才能實現,如

/dev/tty

。在scullpriv

的實現中,驅動程式使用程序控制終端的次裝置號作為建立裝置副本的鍵值。當然,可以使用

uid為每個使用者建立不同的私有副本,或者使用

pid為每個訪問該裝置的程序建立副本。

在兩個終端中,分別對

scullpriv

裝置進行讀寫,可以看到裝置資料是不同的。乙個終端中的裝置寫入了資料,而另乙個終端中的裝置資料仍然為空。

pydeng@pydeng-laptop:/etc$ ls / > /dev/scullpriv

pydeng@pydeng-laptop:/etc$ cat /dev/scullpriv

binboot

cdrom

devetc

...

pydeng@pydeng-laptop:/etc$ cat /dev/scullpriv

pydeng@pydeng-laptop:/etc$

筆記 裝置驅動程式

驅動程式一般指的是裝置驅動程式 device driver 是一種可以使 計算機和裝置通訊的特殊程式。相當於 硬體的介面,作業系統只有通過這個介面,才能控制 硬體裝置的工作,假如某裝置的驅動程式未能正確安裝,便不能正常工作。因此,驅動程式被比作 硬體的靈魂 硬體的主宰 和 硬體和系統之間的橋梁 等。...

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...