《Linux設備設備驅動程序(第三版)》學習筆記之一:scull設備的使用

《Linux設備設備驅動程序(第三版)》學習筆記之一:
scull設備的使用

By: 吳垠
Date: 2007-07-05
Email: lazy.fox.wu#gmail.com
Homepage:
http://blog.csdn.net/wooin
Copyright: 該文章版權由吳垠所有。可在非商業目的下任意傳播和複製。
對於商業目的下對本文的任何行爲需經作者同意。
聯繫方式:lazy.fox.wu#gmail.com

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







 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章