copy_from_user()用於內核模塊。所以我的理解是它在內核空間運行。然而,在我閱讀了這個「只有用戶上下文,這個函數可能會睡眠」之後,我感到困惑。 有人可以給我一個解釋嗎?copy_from_user()在用戶空間或內核空間運行?
回答
短語「用戶上下文」並不涉及用戶空間執行。它指的是在特定用戶進程的上下文中運行的內核代碼。對於from
參數必須有一個相關的用戶過程纔有意義。
報價this web page(我發現有一個快速谷歌搜索「Linux的用戶上下文」):
在Linux 內核有兩個上下文(執行流程的模式):中斷和用戶(空間)上下文。用戶上下文是從用戶空間輸入的代碼 :系統調用。除非內核代碼 由於某種原因睡眠(明確允許其他代碼運行),否則不會在該CPU上運行其他用戶上下文;除非內核代碼 由於某種原因而休眠(明確允許其他代碼運行)這是非優先 的一部分。它們總是與特定的過程相關聯。
但是,中斷可能發生在任何時間,這會暫停用戶 上下文並且運行中斷上下文。這不是與任何進程相關的 ;它是由定時器,外部硬件中斷或外部下半部分(下半部分可能會從 定時器或其他中斷請參見下文)引起的。完成後,將恢復用戶 上下文。
(在評論的0x90表明,這句話是一種誤導,這很可能是正確的。)
我認爲這個報價完全是誤導性的。有內核線程,irq,softirq上下文和用戶線程。從引用可以錯誤地認爲如果內核運行在非用戶執行流程上,它在irq上下文中是完全錯誤的! – 0x90
@ 0x90:然後我建議你發佈一個答案。 –
@ 0x90:或者你可以編輯我的,如果你喜歡。 –
,當這個函數被調用內核裏面,CPU必須在「用戶上下文」是指這裏它被配置爲使用與用戶進程關聯的內存映射的狀態。該映射特定於每個進程,基本上有一個映射到內核內存的範圍和一個映射到用戶進程內存的範圍。這就是爲什麼copy_from_user
能夠將進程內存範圍內的字節複製到內核內存中的內存緩衝區。
在某些情況下,例如處理中斷時,CPU使用不同的存儲器映射,其中沒有用戶進程的範圍,因此copy_from_user
沒有任何意義。
- 1. Linux內核空間和用戶空間
- 2. 在用戶空間和內核空間上執行進程
- 3. 從內核空間執行用戶空間函數
- 4. 內核空間和用戶空間的時間差
- 5. 用戶空間和內核空間崩潰之間的區別
- 6. std :: threads在用戶或內核空間中進行管理?
- 7. 內存分配內核空間和用戶空間進程
- 8. 在內核空間和用戶空間中工作
- 9. 在用戶空間或內核空間中創建Java線程嗎?
- 10. Linux內核 - 從用戶空間停止正在運行的內核定時器
- 11. Linux內核:從內核空間調用用戶空間的回調函數
- 12. ODBC驅動程序在內核空間或用戶空間中運行?爲什麼?
- 13. 用內核觸發用戶空間
- 14. 從插座讀而不從內核空間到用戶空間
- 15. 如何回調從用戶空間保持到內核空間
- 16. 從內核空間傳遞地址到用戶空間
- 17. 從用戶級空間訪問內核空間中的變量
- 18. 將用戶空間代碼移植到內核空間
- 19. 從內核空間繞過數據包到用戶空間
- 20. 如何從用戶空間訪問內核空間?
- 21. 從內核空間訪問用戶空間 - get_user_pages
- 22. 將數據從內核空間複製到用戶空間
- 23. Netlink用戶空間和內核空間通信
- 24. 從用戶空間到內核空間的memcpy
- 25. 用戶空間vs內核空間驅動程序
- 26. Linux用戶空間和內核空間調度
- 27. 內核空間和用戶空間佈局
- 28. a.out內核空間
- 29. bsd內核用戶空間事件kqueue
- 30. linux內核和用戶地址空間
這是一個內核空間函數,在用戶上下文中運行。空間(用戶/內核)和上下文(用戶又名進程/中斷)是兩個不同的東西。 – brokenfoot