2014-05-02 97 views
1

copy_from_user()用於內核模塊。所以我的理解是它在內核空間運行。然而,在我閱讀了這個「只有用戶上下文,這個函數可能會睡眠」之後,我感到困惑。 有人可以給我一個解釋嗎?copy_from_user()在用戶空間或內核空間運行?

+0

這是一個內核空間函數,在用戶上下文中運行。空間(用戶/內核)和上下文(用戶又名進程/中斷)是兩個不同的東西。 – brokenfoot

回答

4

短語「用戶上下文」並不涉及用戶空間執行。它指的是在特定用戶進程的上下文中運行的內核代碼。對於from參數必須有一個相關的用戶過程纔有意義。

報價this web page(我發現有一個快速谷歌搜索「Linux的用戶上下文」):

在Linux 內核有兩個上下文(執行流程的模式):中斷和用戶(空間)上下文。用戶上下文是從用戶空間輸入的代碼 :系統調用。除非內核代碼 由於某種原因睡眠(明確允許其他代碼運行),否則不會在該CPU上運行其他用戶上下文;除非內核代碼 由於某種原因而休眠(明確允許其他代碼運行)這是非優先 的一部分。它們總是與特定的過程相關聯。

但是,中斷可能發生在任何時間,這會暫停用戶 上下文並且運行中斷上下文。這不是與任何進程相關的 ;它是由定時器,外部硬件中斷或外部下半部分(下半部分可能會從 定時器或其他中斷請參見下文)引起的。完成後,將恢復用戶 上下文。

(在評論的0x90表明,這句話是一種誤導,這很可能是正確的。)

+1

我認爲這個報價完全是誤導性的。有內核線程,irq,softirq上下文和用戶線程。從引用可以錯誤地認爲如果內核運行在非用戶執行流程上,它在irq上下文中是完全錯誤的! – 0x90

+1

@ 0x90:然後我建議你發佈一個答案。 –

+0

@ 0x90:或者你可以編輯我的,如果你喜歡。 –

0

,當這個函數被調用內核裏面,CPU必須在「用戶上下文」是指這裏它被配置爲使用與用戶進程關聯的內存映射的狀態。該映射特定於每個進程,基本上有一個映射到內核內存的範圍和一個映射到用戶進程內存的範圍。這就是爲什麼copy_from_user能夠將進程內存範圍內的字節複製到內核內存中的內存緩衝區。

在某些情況下,例如處理中斷時,CPU使用不同的存儲器映射,其中沒有用戶進程的範圍,因此copy_from_user沒有任何意義。

相關問題