我總是被告知(在書籍和教程中),當將數據從內核空間複製到用戶空間時,我們應該使用copy_to_user()並使用memcpy()會導致系統出現問題。最近我錯誤地使用了memcpy(),它在任何問題都很好地工作。 這是爲什麼我們應該用它代替的memcpy()copy_to_usercopy_to_user vs memcpy
我的測試代碼(內核模塊)是這樣的:
static ssize_t test_read(struct file *file, char __user * buf,
size_t len, loff_t * offset)
{
char ani[100];
if (!*offset) {
memset(ani, 'A', 100);
if (memcpy(buf, ani, 100))
return -EFAULT;
*offset = 100;
return *offset;
}
return 0;
}
struct file_operations test_fops = {
.owner = THIS_MODULE,
.read = test_read,
};
static int __init my_module_init(void)
{
struct proc_dir_entry *entry;
printk("We are testing now!!\n");
entry = create_proc_entry("test", S_IFREG | S_IRUGO, NULL);
if (!entry)
printk("Failed to creats proc entry test\n");
entry->proc_fops = &test_fops;
return 0;
}
module_init(my_module_init);
從用戶空間應用程序,我讀我的/proc
進入和一切正常。
查看copy_to_user()的源代碼,它說它也是簡單的memcpy(),我們只是試圖檢查指針是否有效,或者是否使用access_ok和執行memcpy。
所以我的理解目前是,如果我們肯定我們傳遞指針,的memcpy()總是可以代替copy_to_user的使用。
如果我的理解不正確,請糾正我,並且copy_to_user工作和memcpy()失敗的任何示例將非常有用。謝謝。
這是因爲分頁。 – Linuxios 2013-02-20 01:22:11
@Linuxios對不起,但你能解釋一個更多的littl。我無法證明內核能夠完美複製,我也無法在copy_to_user的源代碼中看到與分頁有關的任何內容。你能否詳細說明一下? – 2013-02-20 01:25:07
@Sandy:假設的問題:您正在使用一個32位系統和16 GB的RAM。 memcpy會工作嗎? – 2013-02-20 02:31:39