2016-08-26 69 views
4

以下是我的簡單驅動程序代碼的摘錄。將直接訪問用戶空間地址而不是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生成相同的圖像。 - 沒有任何差異的可能性。

在此先感謝。

+1

幾乎[重複](http://stackoverflow.com/questions/12666493/why-do-you-have-to-use-copy-to-user-copy-from-user-to-access-user -Space-從)。還有'put_user()'可能更適合你的單個int情況。 –

+0

@RomanKhimov從你提到的問題中,我明白'copy_to_user'確實檢查地址是否屬於用戶空間。我懷疑直接訪問是如何工作的。另外,爲什麼直接訪問在某些系統中可用,並且在具有相同操作系統和內核的其他系統中不起作用。 – Karthik

回答

1

會很有趣地看到崩潰。現在我所說的是基於我關於記憶如何工作的知識。用戶空間內存是虛擬的。這意味着特定進程地址X現在位於某個物理內存上,該物理內存是當前分配給進程的內存頁。複製給用戶首先檢查給出的內存是否屬於進程和其他安全檢查。除此之外還有映射問題。

內核內存有自己的地址空間,需要將虛擬地址映射到物理地址。內核使用mmu的幫助(這在每個架構上都是不同的)。在x86中,內核虛擬和用戶虛擬之間的映射是1:1(這裏有不同的問題)。在其他系統中,這並非總是如此。

+0

//在x86中,內核虛擬和用戶虛擬之間的映射是1:1 //所以,你說內核虛擬地址和用戶虛擬是相同的,所以我可以直接在內核中使用用戶虛擬。我對嗎?但是我使用的所有系統都是具有相同操作系統映像的x86系統。 – Karthik

相關問題