copy_to_user 和 copy_from_user


轉載:http://blog.csdn.net/joker0910/article/details/6608266

 

<asm/uaccess.h>

copy_from_user函數目的是從用戶空間拷貝數據到內核空間,失敗返回沒有被拷貝的字節數,成功返回0。從用戶空間拷貝數據到內核中時必須非常小心,如果用戶空間的數據地址是個非法的地址,或是超出用戶空間的范圍,或是那些地址還沒有被映射到,都可能對內核產生很大的影響。copy_from_user函數的功能就不只是從用戶空間拷貝數據那樣簡單了,它還要做一些指針檢查以及處理這些問題的方法。

unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) { might_sleep(); if (access_ok(VERIFY_READ, from, n)) n = __copy_from_user(to, from, n); else memset(to, 0, n); return n; }

首先這個函數是可以睡眠的,它調用might_sleep()來處理,#define access_ok(type,addr,size) (likely(__range_ok(addr,size) == 0)),進一步調用__range_ok函數來處理,它所做的測試很簡單,就是比較addr+size這個地址的大小是否超出了用戶進程空間的大小,在做完地址范圍檢查后,如果成功則調用__copy_from_user函數開始拷貝數據了,如果失敗的話,就把從to指針指向的內核空間地址到to+size范圍填充為0。

copy_to_user函數則是從內核空間拷貝內容到用戶空間,用戶空間的進程無法直接訪問內核空間的內容。這個函數做了數據合法判斷。然后進行拷貝。

   copy_to_user(void __user *to, const void *from, unsigned long n) { if (access_ok(VERIFY_WRITE, to, n)) n = __copy_to_user(to, from, n); return n; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM