以下是我的簡單驅動程序代碼的摘錄。將直接訪問用戶空間地址而不是copy_to_user是否工作?
int vprobe_ioctl(struct file *filep, unsigned int cmd, void *UserInp)
{
case IOCTL_GET_MAX_PORTS:
*(int*)UserInp = TotalPorts;
#if ENABLED_DEBUG
printk("Available port :%u \n ", TotalPorts);
#endif
break;
}
我不知道哪些應該,而在用戶空間內存寫入使用的功能copy_to_user
。代碼直接訪問用戶地址。但是我仍然沒有在我的開發系統(x86_64體系結構)中發生內核崩潰。它按預期工作。
但是有時候我在其他一些x86_64機器上插入.ko文件時可能會看到內核崩潰。所以,我用copy_to_user
取代了直接訪問,它可以工作。
任何人都可以請解釋一下,
我)用戶地址的作品訪問如何直接?
ii)爲什麼我在某些系統中看到內核崩潰,而在其他一些系統中運行良好。系統之間是否有內核配置不匹配,因爲內核可以直接訪問用戶進程的虛擬地址?
注意:我使用的所有系統都具有相同的操作系統和內核。 - 通過kickstart生成相同的圖像。 - 沒有任何差異的可能性。
在此先感謝。
幾乎[重複](http://stackoverflow.com/questions/12666493/why-do-you-have-to-use-copy-to-user-copy-from-user-to-access-user -Space-從)。還有'put_user()'可能更適合你的單個int情況。 –
@RomanKhimov從你提到的問題中,我明白'copy_to_user'確實檢查地址是否屬於用戶空間。我懷疑直接訪問是如何工作的。另外,爲什麼直接訪問在某些系統中可用,並且在具有相同操作系統和內核的其他系統中不起作用。 – Karthik