2012-07-27 48 views
0

我的理解是用戶任務可以同時訪問用戶空間的3G和內核空間的1G。但是內核任務只能訪問其唯一的1G內核空間。但是在task_struct中,它鏈接到指向用戶空間的vm_area_struct,對嗎?如果正確,那麼這意味着內核任務也可以直接訪問用戶空間?內核任務可以訪問它的vm_area_struct嗎?

回答

0

下面是羅伯特·愛的LKD3:在的mm_struct和內核線程(P309)

內核線程沒有進程的地址空間,因此不具有associ- ated內存descriptor.Thus的MM場內核線程的進程描述符是NULL。 這是內核線程的定義 - 沒有用戶上下文的進程。

這種地址空間的缺失很好,因爲內核線程永遠不會訪問任何用戶空間內存。 (他們將訪問誰?)由於內核線程在用戶空間中沒有任何頁面 ,所以他們不配擁有自己的內存描述符和頁表。 (Page )儘管如此,內核線程還是需要某些 數據(例如頁表),甚至可以訪問內核內存。要提供內核線程所需的數據,而不浪費內存內存描述符和頁表,或者每當內核線程開始運行時,處理器週期切換到新的地址空間,內核線程使用之前運行的任何任務的內存描述符。

無論何時調度進程,都會加載進程的 毫米字段引用的進程地址空間。然後會更新進程描述符中的active_mm字段,以將 引用到新的地址空間。內核線程沒有地址空間,mm是NULL。 因此,當調度內核線程時,內核注意到mm爲NULL並且保持先前進程的地址空間被加載。然後內核更新內核線程的進程描述符的active_mm字段 以參考先前進程的存儲器 描述符然後,內核線程可以根據需要使用先前進程的頁表。 由於內核線程不訪問用戶空間內存,因此它們僅在與內核內存相關的地址空間中使用 信息,這對於所有 進程都是相同的。

0

用戶任務可以訪問用戶空間(映射的區域)中唯一的低3G,內核可以訪問所有3G + 1G空間。內核不直接訪問用戶空間地址,它使用copy_from(to)_user()API。

+1

應該指出,這些限制只適用於32位應用程序... – thkala 2012-07-27 09:09:22

+0

@thkala你是對的,謝謝。 – 2012-07-27 09:22:25

+0

但內核* struct *不直接訪問用戶空間。所以我的問題是它如何處理它應該鏈接到用戶空間的vm_area_struct? – 2012-07-27 11:21:46

相關問題