scull驅動學習!

2021-09-30 09:17:46 字數 3223 閱讀 7249

《linux裝置裝置驅動程式(第三版)》學習筆記之一:

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一下就 好了^_^

今天學習這個驅動例子,發現用printk列印的資訊沒有在/var/log/messages檔案中,而是在/var/log/kern.log中,我用的是ubuntu10.

Linux字元驅動 scull

源 除錯環境 ubuntu14.04 核心版本 3.13.0 32 scull.c include include include include include include include include include scull.h int scull major scull major ...

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

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

理解scull裝置

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