實驗編號
2
題目字元裝置
實驗目的
了解linux
裝置管理原理,。
實驗內容
實現乙個虛擬的字元裝置及其相關的驅動程式,支援以下功能:
使用者可以向裝置寫入字串,並覆蓋裝置中原有的字串;
使用者可以從裝置讀出寫入的字串;
使用者通過系統呼叫
ioctl
清除裝置中寫入的字串
;
裝置關閉前,只能被開啟一次
.
參見即ppt中的
rwbuff
裝置及其驅動程式
報告內容要求
(1)
程式實現方法和思路
(2)
測試及結果報告
正文一、實現思路:
linux
將硬體裝置看做一類特殊的檔案
(/dev/*)
,裝置驅動程式被組織為一組完成不同任務的函式的集合,通過這些函式使得
linux
的裝置操作猶如檔案一般。在應用程式看來,硬體裝置只是乙個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作,如
open()
、close()
、read()
、write()
等。所以,乙個字元
( char )
裝置也就是一種可以當作乙個位元組流來訪問的裝置
( 如同乙個檔案
),可以通過一系列的檔案操作實現字元裝置驅動程式。 二、
實驗步驟:
(1)設定核心支援模組(
make menuconfig
),如圖2.1所示:
圖2.1模組支援的設定
不過,這一步可以省略,因為所使用的
linux
系統――
linux-up
核心,預設支援模組的。
(2)所需標頭檔案及巨集定義
#include
// for kernel programming
#include
//for kernel module struct.
#include //struct file_operations
#definerwbuf_name「rwbuf」//
裝置檔案
/dev/rwbuf
#definerwbuf_dev「/dev/rwbuf」
// device path
#definerwbuf_major60
// 主裝置號
#definerwbuf_clear0x909090
// io ctrl command
(3)重要的資料結構:
file_operations
,file
,inode
中定義了這三個結構
結構定義了一組函式指標
,每乙個開啟的檔案(用
struct file表示)
和它自己的一組函式
(包含在乙個叫
f_op
的域中,
它指向乙個
struct file_operations結構)
相聯絡.
這些操作都是來實現系統呼叫的
,所以才被命名為
open,read,等等.
對於那些不需要的功能(
比如你的裝置不需要
write功能,
即不需要向裝置寫資料
),可以給
write
指標付null.
struct file
每個開啟的檔案對應乙個
struct file.
它在被開啟時由核心建立
,並傳給它所有可以操作該檔案的函式
,到檔案被關閉時才被刪除
.the inode structure.
inode
結構是用來在核心內部表示檔案的
.同乙個檔案可以被開啟好多次
,所以可以對應很多
struct file,
但是只對應乙個
struct inode.
該結構裡面包含了很多資訊,但是
,驅動開發者只關心裡面兩個重要的域
:dev_t i_rdev;//
含有真正的裝置號
struct cdev *i_cdev;//struct cdev
是核心內部表示字元裝置的結構
.
(4)註冊裝置號
定義好major
和minor number
後就可以在核心中註冊乙個裝置了
.註冊乙個字元裝置需要用到下面幾個函式
:int register_chrdev_region(dev_t first,unsigned int count,char *name);
first
是要註冊的裝置號範圍的開始(其中
minor
號一般設定為
0),count
是所申請的連續裝置號的總數
.name
是裝置的名稱
.它會在
/proc/devices
中出現.
int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
這個函式是用來動態分配裝置號的
.有餘開發者不知道所要用的
major
號是多少
,便讓核心動態分配乙個.引數
dev是個
output-only引數.
void unregister_chrdev_region(dev_t first,unsigned int count);
一般在模組清除函式中呼叫
.
(5)使用者介面實現
定義操作集合:
static struct file_operations rwbuf_fops =
;
然後分別實現各個操作,詳見**。
(6)編譯及載入裝置模組
編譯:gcc -c rwbuf.c -d__kernel__ -dmodule -dmodversions -wall -include /usr/src/linux/include/linux/modversions.h -i/usr/src/linux/include
安裝與解除安裝:
mknod/dev/rwbufc600
建立裝置檔案
/sbin/insmod
rwbuf.o
安裝裝置驅動
/sbin/rmmodrwbuf
解除安裝裝置驅動
(7)測試驅動程式
void writer()
void reader()
void cleaner()
三、實驗結果:
圖2.2
字元裝置測試結果
測試結果如上圖2所示,可以說明字元驅動裝置新增成功。
如果將rwbuf模組解除安裝,則測試程式將不能輸入寫入的字串,如下圖所示:
圖2.3
解除安裝先前已裝入的字元裝置
Linux中字元裝置和塊裝置
linux中i o裝置分為兩類 字元裝置和塊裝置。兩種裝置本身沒有嚴格限制,但是,基於不同的功能進行了分類。1 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機訪問。相反,此類裝置支援按位元組 字元來讀寫資料。舉例來說,鍵盤 串列埠 數據機都是典型的字元裝置。2 塊裝置 應用程式可以...
Linux系統中裝置分類
一般來說,linux把裝置驅動程式分為4種 字元裝置,塊裝置,網路裝置及其他裝置。其中字元裝置和塊裝置可以像檔案一樣被訪問。例如 驅動程式通常會實現open,close,write,read,seek等操作。網路裝置在linux系統中是一模擬較特殊的裝置,它不像字元裝置或者塊裝置那樣對應裝置檔案節點...
Linux 中字元裝置的註冊
linux中字元裝置的註冊過程是比較簡單的。我們通常可以呼叫misc register 函式來註冊乙個字元裝置。misc裝置是一種字元裝置,通過該裝置可以將fops請求 給註冊的misc裝置,從而實現字元裝置的功能。使用者呼叫該介面註冊misc字元裝置時,可以動態分配裝置minor號,當獲取mino...