天天看點

澄清一個get_user_pages的事實

get_user_pages的作用是得到使用者的頁面,作為參數傳回,注意,得到的是一個page結構數組而不是别的,這些page最起碼 在目前記錄着使用者程序的資料,一般情況下,核心在調用此函數得到使用者頁面以後,會再将它們映射到核心空間的一個虛拟位址,然後操作這些頁面的資料。這樣的話在調用完get_user_pages之後然後映射到核心的的頁面就最少在兩個地方有映射,一個是使用者空間,一個是核心空間。這時問題出來了,這些頁面可能會被換出,get_user_pages并沒有做任何事情比如鎖住頁面以保證頁面不被換出,在頁面換出的時候,使用者映射的頁表項的存在位會被清除,但是這可能不會通知該頁面的核心映射的頁表項,如果核心繼續讀寫該頁面,那麼結果将是錯誤的,是以,核心不應該長時間的保持get_user_pages的映射,請看下面的例子,在2.6核心的aio中: 

... 

info->nr_pages = get_user_pages(current, ctx->mm, info->mmap_base, nr_pages, 1, 0, info->ring_pages, NULL); 

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274028