unsigned long copy_from_user (void *to, const void *from, unsigned long count); unsigned long copy_to_user (void *to, const void *from, unsigned long count);
在 read()、write()、或 ioctl() 等,可能需要在 user-space 和 kernel-space 間搬移資料,本質是 memcpy(),回傳未完成的 byte 數。此外也 access_ok() 檢查 user-space 指標是否 valid。另外有 __get_user() 和 __put_user()。
User-space 資料
- user-space 指標在 kernel 未必是對的,和運行的 architecture 和 kernel 的設定有關。(有不對的例子嗎?)
- user-space 資料可能 page-out 而不在記憶體中,直接存取會造成 page fault OOPS。
- user program 提供的 pointer 可能是 buggy or malicious,而開了一個後門造成安全問題。例如指到 kernel-space 並寫入資料,變成 kernel 資料無故被改變。
如果不需要 access_ok() 檢查,例如已經檢查過,__copy_to_user()、__copy_from_user()、__get_user() 和 __put_user() 版本。
driver accesses user space must be reentrant, must be able to execute concurrently with other driver functions, and, in particular, must be in a position where it can legally sleep.
參考
- LDD chap 3
- LDD chap 6
沒有留言:
張貼留言