2012-04-21 129 views
3

我寫的字符設備驅動程序自己在LKM,其只需在讀/寫字符設備:如何在Linux內核模塊

dev_open(struct inode *inode, struct file *filp); 
dev_read (struct file *filp, char __user *buf, size_t count, loff_t *f_pos) 
dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) 
dev_release(struct inode *inode, struct file *filp) 

然後在我的內核模塊,我也想寫的字設備,和寫必須居然打電話給我的功能:

dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) 

我發現一個類似link在這裏SE,但這種方式也不會叫我dev_write()函數寫,但一些深層次像vfs_write(),右?

回答

1

不要嘗試從您的模塊中調用dev_write()。如果這真的是你想要做的,你需要一個單獨的方式讓你的模塊寫入設備。在進行內部寫入時,您沒有有效的filp或用戶內存緩衝區。

例如dev_write()將使用filp來確定用戶正在寫入哪個設備,並檢查並複製用戶緩衝區中的數據。它可以調用一個單獨的輔助函數來將數據粘貼到適當的內部緩衝區中。

您的內部代碼只會調用該輔助函數直接追加緩衝區。如果您的驅動程序支持多個設備,那麼當您執行內部寫入時,您需要知道並指定您正在寫入的設備的哪個實例。

+1

特別是,'dev_write'必須使用'copy_from_user'類的函數來安全地從用戶空間複製數據,這將阻止它從內核空間緩衝區複製數據。原則上,您可以設置一個虛擬用戶空間上下文來處理,但爲自己創建一個後門更容易。 – bdonlan 2012-04-22 02:56:21

+1

@bdonlan我是linux內核編程的新手,請給我一個關於如何設置一個虛擬用戶空間上下文來處理或創建一個後門的詳細指令 – keywind 2012-04-22 07:23:12