1. 程式人生 > >copy_from_user/copy_to_user函數中的buf參數釋疑

copy_from_user/copy_to_user函數中的buf參數釋疑

n) in use 檢查 結果 sig nbsp you color 實驗

從開始了解內核開始就一直在疑惑

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);

這裏面的from指針是什麽?從用戶空間的read到內核空間fops中的read函數過來後,這個值是否經過了轉換?是物理地址還是直接是用戶進程地址空間中的虛擬地址?

今天特地做了個實驗,最後得出答案是後者,from的值就是用戶進程地址空間中的虛擬地址。

kernel要想得到詳細的物理地址還須要進行一系列的權限檢查,最後經過頁表轉換才行

這是在用戶空間進行的測試。

代碼是

printf("the address in userspace: %x\n", yourmsg);


技術分享

在用戶空間輸出地址結果例如以下:

技術分享技術分享

而在內核模塊中的代碼是:

printk(KERN_ALERT "in kernel space: %x\n", buf);

技術分享技術分享

結果輸出例如以下:

技術分享技術分享

能夠看到無論在內核空間還是進程空間,值都是bfad8554。得證。

copy_from_user/copy_to_user函數中的buf參數釋疑