慢慢學Linux驅動開發,第七篇,scull的使用

來源:互聯網
上載者:User

        剛剛make好scull,非常的興奮,立即使用了一下,本想總結在寫一篇文章,不夠偶爾發現了一篇很不錯的文章,於是就轉載過來,偷偷懶,不自己寫了,嘿嘿。

 

By:
吳垠

 

1. 寫在前面:
a. 在進行下面的工作之前請先閱讀我 的文章
《在 Linux 2.6核心下編譯可以載入的核心模組》
,配 置好可載入核心模組的Linux環境
b. 下載《Linux裝置裝置驅動程式(第三版)》配套的源代 碼,在這裡
可 以下載到,如果無法下載的話可以留言
或者給我發郵件索取。
c. 本文的工作環境是Fedora Core 5,用“uname -r”查看核心版本是:2.6.15-1.2054_FC5
d. 本文主要針對的是《Linux裝置裝置驅動程式(第三 版)》中第三章:字元裝置驅動程式
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一下就 好了^_^

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.