我在內核模塊中創建了塊設備。當某些I/O發生時,我將讀取/寫入所有數據到另一個現有設備(比如/dev/sdb
)。從內核模塊到設備的I/O到EFAULT失敗
它打開OK,但讀/寫操作返回14錯誤(EFAULT
,壞地址)。經過一番研究,我發現我需要映射地址到用戶空間(可能是buffer
或filp
變量),但copy_to_user
函數沒有幫助。此外,我期待mmap()
和remap_pfn_range()
函數,但我不能得到如何在我的代碼中使用它們,特別是在哪裏得到正確的vm_area_struct
結構。我發現的所有例子,都使用char設備和file_operations
結構,而不是塊設備。
任何提示?感謝幫助。
這裏是我的代碼閱讀:
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
filp = filp_open("/dev/sdb", O_RDONLY | O_DIRECT | O_SYNC, 00644);
if(IS_ERR(filp))
{
set_fs(old_fs);
int err = PTR_ERR(filp);
printk(KERN_ALERT"Can not open file - %d", err);
return;
}
else
{
bytesRead = vfs_read(filp, buffer, nbytes, &offset); //It gives 14 error
filp_close(filp, NULL);
}
set_fs(old_fs);
什麼是「緩衝區」? –
'buffer'是一個'char *'變量。我們從'/ dev/sdb'讀取數據。它來自'request-> buffer'這樣的'request'函數。 –