⑴ linux驅動開發第2講:應用層的write如何調用到驅動中的write
在Linux操作系統中,一切都以文件的形式呈現,包括文件、目錄、設備、socket套接字和管道。這種文件抽象使得基於Linux的編程轉變為面向文件的編程,對應用程序開發者來說十分便捷。
然而,對於內核開發者而言,情況則有所不同。盡管應用程序可以通過open、write、read等函數操作一切,但在內核中,需要不同的驅動部分來真正實現這些操作。本文將深入探討Linux應用程序中的write()函數如何調用到特定驅動(如hello驅動)內的write()函數,並解答上一講遺留的問題。
流程圖說明如下:應用層調用系統調用,系統調用再通過軟中斷方式進入內核空間,最終由內核處理數據。需要注意的是,應用空間與內核空間彼此隔離,因此系統調用需要通過_from_user函數將應用層數據復制到內核空間,才能進行處理。
系統調用如何知道調用哪個驅動的函數呢?答案隱藏在驅動初始化階段。在hello驅動中,通過定義主次設備號並在init函數中建立gDev和gFile之間的關系,然後通過cdev_init、cdev_add等函數進一步建立了gFile與主次設備號之間的關聯。這樣,當應用層嘗試訪問特定文件(如/dev/hello)時,已經建立了與對應驅動(hello驅動)的關聯。
實際上,當應用層打開文件後,已經與驅動中的struct file建立了對應關系,同時與struct file_operations也建立了關聯。在Linux內核中,struct file_operations用於描述文件的操作,而struct file則用於表示打開的文件。因此,應用層的write操作通過系統調用進入內核空間後,內核會根據主次設備號查找對應的struct file_operations,進而調用相應驅動內的write函數。
在內核的write系統調用實現中(位於fs/read_write.c),關鍵在於判斷並調用特定驅動的write函數。通過檢查struct file_operations中是否包含write函數的實現,系統調用最終調用到hello驅動內的write函數。由於hello驅動中的write函數實現了預期功能,因此應用層的write操作得以成功執行並返回。
要使測試程序中的write和read操作返回非零值,只需在驅動中修改write函數的返回值即可。通過自行測試,你可以驗證這一過程並深入理解Linux驅動與應用程序之間的交互機制。
⑵ linux驅動怎麼讀寫文件
struct file_operations scull_fops = {
.read = scull_read,
.write = scull_write,
.open = scull_open,
};
在linux驅動中比較重要的結構體 file_operations裡面實現 驅動讀寫的功能