scull裝置的使用

2021-06-01 23:13:46 字數 3104 閱讀 6789

scull裝置的使用

by:吳垠date:

2007-07-05

email:

lazy.fox.wu#gmail.com

homepage:

1.寫在前面:

a.在進行下面的工作之前請先閱讀我 的文章

《在 linux 2.6核心下編譯可以載入的核心模組》

,配 置好可載入核心模組的linux環境

b.c.

d.e.

下文的有些操作需要root許可權,所以請盡量用root用 戶來執行命令。 2.

源**包解壓後進入scull資料夾,其中的檔案有:

access.c

main.c

主程式,scull裝置的初始化、解除安裝、open、 write等實現都在這裡面。

makefile

pipe.c

第六章《高階字元驅動程式操作》會用到,用來講解阻塞型設 備。

scull.h

標頭檔案scull.init

scull_load

載入scull模組的指令碼

scull_unload 

解除安裝scull模組的指令碼 3.

直接在scull目錄下執行make命令就可以編譯通過,會生成乙個叫scull.ko的檔案,然後執行指令碼scull_load, 沒有任何輸出就返回了,scull裝置就會自動載入到核心當中去了,此時可以通過檢視/proc/devices檔案找到剛載入的scull模組,還有內 核為其分配的主裝置號。

在/dev/中也增加很多以scull開頭的字元裝置。

4.試試scull裝置:

執行命令:

# ls -l > /dev/scull  # 沒有任何輸出就返回了

# cat /dev/scull     # 再執行cat命令讀取scull裝置,則會將上面命令的輸出資訊讀出來

總計 900

-rw-rw-rw- 1 baobaowu baobaowu 10845 2005-02-01 access.c

-rw-rw-r-- 1 baobaowu baobaowu 74580 06-15 16:27 access.o

-rw-rw-rw- 1 baobaowu baobaowu 16631 06-15 17:15 main.c

-rw-r--r-- 1 baobaowu baobaowu 74512 06-15 17:16 main.o

-rw-r--r-- 1 baobaowu baobaowu 752 2005-02-01 makefile

-rw-rw-rw- 1 baobaowu baobaowu 11138 2005-02-01 pipe.c

-rw-rw-r-- 1 baobaowu baobaowu 71576 06-15 16:27 pipe.o

-rw-r--r-- 1 baobaowu baobaowu 5153 2005-02-01 scull.h

-rwxr-xr-x 1 baobaowu baobaowu 3309 2005-02-01 scull.init

-rw-r--r-- 1 baobaowu baobaowu 248556 06-15 17:16 scull.ko

-rwxr-xr-x 1 baobaowu baobaowu 1708 06-15 16:34 scull_load

-rw-rw-rw- 1 baobaowu baobaowu 1852 06-15 17:16 scull.mod.c

-rw-r--r-- 1 baobaowu baobaowu 33696 06-15 17:16 scull.mod.o

-rw-r--r-- 1 baobaowu baobaowu 216043 06-15 17:16 scull.o

-rwxr-xr-x 1 baobaowu baobaowu 335 2005-02-01 scull_unload

果然scull裝置跟書中介紹的一樣,只是存在於記憶體中的乙個緩衝區。

5.再執行scull_unload,也是沒有任何輸出就返回了,但是scull模組卻已經從核心中刪除了,/proc/devices 檔案中也沒scull裝置了,/dev/中也沒有以scull開頭的字元裝置了。

6.下面在scull增加一些除錯資訊:

開啟main.c檔案,在函式scull_init_module()的頭部增加一句:

printk(kern_alert "debug by baobaowu:scull_init_module()/n");

在函式scull_read()的頭部增加一句:

printk(kern_alert "debug by baobaowu:scull_read()/n");

在函式scull_write()的頭部增加一句:

printk(kern_alert "debug by baobaowu:scull_write()/n");

儲存後執行make進行編譯。

7.重複第3步,將scull載入進核心中,此時核心應該呼叫main.c中的scull_init_module()函式,是不是呼叫 了呢?我們看看/var/log/messages檔案,果然在該檔案最後有輸出我們的除錯資訊:

debug by baobaowu:scull_init_module()

那read和write怎麼呼叫呢?我們緊接著下面介紹。

8.可以想像,向裝置中寫資料就會呼叫scull_write()函式,我們執行下面的命令利用輸出重定向來向/dev/scull裝置 寫資料:

# ls -l > /dev/scull

執行完命令後再看看/var/log/messages檔案,果然在該檔案最後有輸出我們的除錯資訊:

debug by baobaowu:scull_write() 9.

從裝置中讀取資料應該就會呼叫scull_read()函式,我們利用dd命令來讀scull裝置:

# dd if=/dev/scull of=temp  # 從/dev/scull中讀取資料,儲存在當前目錄下的temp檔案中

執行完命令後再看看/var/log/messages檔案,果然在該檔案最後有輸出我們的除錯資訊:

debug by baobaowu:scull_read()

10.本文介紹的scull使用方法除錯成功後對讀第三章《字元裝置驅動程式》很有幫助,當遇到不懂,或不確定的地方時printk一下就 好了^_^

理解scull裝置

scull裝置是乙個操作記憶體的字元裝置,不是真正的裝置,只是向核心註冊為字元裝置,並使用記憶體來訪問資料。當使用者向其中寫資料時,它就申請空閒記憶體來存放使用者資料 當使用者讀取其資料時,便按順序讀取資料。接下來兩個結構貫穿整個驅動,理解它是很必要的。struct scull qset struc...

Scull字元裝置驅動模組的記憶體使用分析

先看一下每個scull dev的資料結構的定義 struct scull qset struct scull dev 每個scull裝置都有乙個資料指標,每個指標都指向下乙個scull qset資料結構。每個記憶體區成為乙個量子quantum,這個指標陣列即它的長度成為量子集qset,這個兩個值可以...

定位裝置使用的頻率

北斗 1561.10mhz gps 1575.42mhz gps頻段表 1.l1波段 1.57542ghz。2.l2波段 1.22760ghz。3.l3波段 1.38105ghz。4.l4波段 1.84140ghz 預計將在2017年開始使用 單頻接收機只能接收l1載波訊號,測定載波相位觀測值進行定...