Linux驅動程式框架介紹

2021-06-03 10:51:04 字數 2192 閱讀 8418

一、linux的裝置驅動程式與外界的介面可以分為三個部分

1.驅動程式與作業系統核心的介面。通過file_operations(include/linux/fs.h)資料結構來完成的。

2.驅動程式與系統引導的介面。這部分利用驅動程式對裝置進行初始化。

3.驅動程式與裝置的介面。這部分描述了驅動程式如何與裝置進行互動,與具體的裝置密切相關。

二、根據功能劃分,裝置驅動程式的**有以下幾部分

1.驅動程式的註冊和登出。

2.裝置的開啟和釋放。

3.裝置的讀寫操作。

4.裝置的控制操作。

5.裝置的中斷和輪詢處理。

三、驅動程式的註冊和登出

裝置驅動程式可以在系統啟動的時候初始化,也可以在需要的時候動態載入。字元裝置的初始化由chr_dev_init()完成,包括對記憶體(devfs_register_chrdev(mem_major,"mem",&memory_fops)),終端(tty_init()),印表機(lp_init()),滑鼠(misc_init())等字元裝置的初始化。

塊裝置初始化由blk_dev_init()完成,這包括對ide硬碟(ide_init()),軟盤(floppy_init()),光碟機等塊裝置的初始化。

每個字元裝置或是塊裝置的初始化都是通過devfs_register_chrdev()或是devfs_register_blkdev()向核心註冊。在關閉字元裝置或是塊裝置時,還需要通過devfs_unregister_chrdev()或是devfs_unregister_blkdev()從核心中登出裝置。

四、裝置的開啟和釋放

開啟裝置是由open()來完成的。例如,印表機是用lp_open()開啟的,而硬碟是用hd_open()開啟的。在大部分裝置驅動程式中,open完成如下工作:

1.增加裝置的使用計數。

2.檢查裝置的相關錯誤,如裝置尚未準備好或是類似硬體的問題。

3.檢查是首次開啟,則初始化裝置。

4.識別次裝置號,如有必要則更新f_op指標。

5.如果需要,分配且設定要放在filp->private_data裡的資料結構。

釋放裝置由release()來完成,例如釋放印表機是用lp_release(),而釋放終端裝置是用tty_release()。釋放裝置的一般步驟包括:

1.釋放在filp->private_data中的open分配的記憶體。

2.如果是最後一次釋放,則關閉裝置。

3.遞減設別的使用計數。

五、裝置的讀寫操作

字元裝置使用各自的read()和write()來進行資料讀寫。例如,對虛擬終端的讀寫是通過vcs_read()和vcs_write()來進行資料讀寫的。

塊裝置使用通用的generic_file_read()和generic_file_write()來進行資料讀寫。這兩個通用函式向請求表新增讀寫請求,核心可以通過ll_rw_block()優化請求順序。由於是對記憶體緩衝區而不是裝置進行操作的,因而可以加快讀寫請求。如果記憶體緩衝區內沒有要讀入的資料或是要將寫請求寫入裝置,那麼就要真正的執行資料傳輸。這是通過資料結構request_queue和request_fn()來完成(include/linux/blkdev.h)。

六、裝置的控制操作

除了讀寫操作,有時還要控制裝置。這可以通過裝置驅動程式中的ioctl()來完成。例如ide硬碟的控制可以通過hd_ioctl(),對光碟機的控制可以通過cdrom_ioctl()。

與讀寫操作不同,ioctl()的用法與具體裝置密切相關。以軟碟機的floppy_ioctl()為例(drivers/block/floppy.c):

static int fd_ioctl(struct inode *inode,

struct file *filp,

unsigned int cmd,

unsigned long param);

其中,cmd的取值及含義都是與軟碟機有關的,比如,fdeject表示彈出軟盤。

除了ioctl(),裝置驅動程式還可能有其他控制函式,比如llseek()等。

七、裝置的輪詢和中斷處理

對於不支援中斷的裝置,讀寫時需要輪詢裝置狀態,以及是否需要繼續進行資料傳輸。例如,印表機。如果裝置支援中斷,則可按照中斷方式進行。

Linux驅動程式框架介紹

一 linux的裝置驅動程式與外界的介面可以分為三個部分 1 驅動程式與作業系統核心的介面。通過file operations include linux fs.h 資料結構來完成的。2 驅動程式與系統引導的介面。這部分利用驅動程式對裝置進行初始化。3 驅動程式與裝置的介面。這部分描述了驅動程式如何...

Linux裝置驅動程式框架

一 linux的裝置驅動程式與外界的介面可以分為三個部分 1 驅動程式與作業系統核心的介面。通過file operations include linux fs.h 資料結構來完成的。2 驅動程式與系統引導的介面。這部分利用驅動程式對裝置進行初始化。3 驅動程式與裝置的介面。這部分描述了驅動程式如何...

linux字元裝置驅動程式框架

include include include include include include include include include include include include define device count1 字元裝置結構體 struct dev struct dev dev...