vmalloc/vfree問題思考記錄

  1. arm 32 用戶進程陷入內核態經過vmalloc/vfree分配內存的流程
    • 內核在更新非連續內存區對應的頁表項是很是懶惰的。--《深刻理解linux內核》
    • arm 32 只有一個PGD 寄存器,即每一個進程的內核態和用戶態是共享一份PGD,不一樣於內核主頁表
    • vmalloc分配內存時,實際是將物理內存映射到內核的主頁表(即init_task的頁表);
    • 當用戶進程訪問vmalloc內存時,觸發vmalloc fault,同步init_task的vmalloc一級頁表到進程PGD,即vmalloc的二級頁表,你們都是共用一份的;
    • 當第二用戶進程訪問vmalloc內存,同上;
    • 當用戶進程vfree時,實際是將物理內存釋放,同時釋放二級頁表,以及將init_task的vmalloc一級頁表置0;
    • 當第二個用戶進程繼續訪問vmalloc內存時,觸發vmalloc transaction fault(二級頁表異常),此時因爲init_task並沒有此二級頁表,沒法同步,故panic。
  2. arm 64 vmalloc/vfree流程
    • arm 64 有兩個PGD 寄存器,其中一個存放用戶態的PGD,一個存放內核態的PGD(即init_task的PGD,整個內核空間只有一個PGD);
    • 因爲你們都是共用一個PGD,就無所謂的vamlloc fault了,流程也簡單明瞭了
  3. 問題引伸
    • copy_from_usr/copy_to_usr在arm 64如何實現?arm 32因爲內核態用戶態共用一個PGD,即經過簡單的copy便可;
    • arm 32理論上來說也是能夠實現用戶態一個PGD,內核態一個PGD,只須要在每次狀態切換時更新PGD便可,那爲什麼不這麼作呢?
    • 切換PGD,引發TLB 抖動,如何減小 TLB 抖動?答案是TLB ASID!
相關文章
相關標籤/搜索