« Embedded Linux 2006 十大回顧! | Home | (非關 Embedded Linux)Google Trends 反應人心! » Linux 驅動程式的 I/O, #3: kernel-space 與 user-space 的「I/O」jollen 發表於 December 26, 2006 11:40 PM 重要觀念 任何作業系統底下的「驅動程式」,都需要分二個層面來討論所謂的「I/O 處理」:
在前一篇日記「Linux 驅動程式的 I/O, #2: I/O 存取相關函數」中所提到的 I/O 函數是處理「實體層」的 I/O;本日記所要介紹的 copy_to_user() 與 copy_from_user() 則是在處理「虛擬層」的 I/O。另外,在繼續往下讀之前,您必須了解以下的觀念都是「等價」的:
此外,還要了解:
copy_to_user() 與 copy_from_user() 了解以上的觀念後,再來「直接殺進重點」就很容易懂了:從 user-space 讀取資料至 kernel-space,或是將 kernel-space 的資料寫至 user-space,「必須」透過 kernel 提供的 2 個 API 來進行。這二個 API 如下: ˙ long copy_to_user(void *to, const void *from, long n); 參數說明,以 copy_to_user() 來說: ˙ to:資料的目的位址,此參數為一個指向 user-space 記憶體的指標。 以 copy_from_user() 來說: ˙ to:資料的目的位址,此參數為一個指向 kernel-space 記憶體的指標。 由 user-space 讀取資料,或是寫入資料給 user-space 的 3 個 driver method 為:read、write與ioctl。 另外,指向 user-space 的指標是 kernel 回呼 driver method 時所傳遞進來的,可由 read、write 與 ioctl driver function 的函數原型宣告來觀察(紅色部份): ˙ int card_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); fops->ioctl 的參數 arg、fops->write 與 fops->read 的參數 buff 是指向 user-space 資料的指標。撰寫程式時,要注意資料型別上的不同。 下一篇日記再寫一個範例來配合著研究,大家應該會更清楚。
--jollen 引用通告如果您想引用這篇文章到您的Blog, |
Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org
評論 (2)
作者您好
我是自已研讀LDD 2ed的一個學生
無意間看到這個網站,覺得很不錯
裡面觀念解說的很清楚,重點也有作標記
但是對於driver,如何去作interrupt、poll
還不是很清楚
不曉得作者,還會繼續往下寫嗎?
期待作者新作的fish39
由 期待作者新作的fish39 | March 30, 2007 10:22 PM
發表於 March 30, 2007 22:22
Dear fish39,
Linux device driver 的部份,過些時日我會再繼續補齊的 ;-)
由 jollen | April 10, 2007 4:00 PM
發表於 April 10, 2007 16:00