vmalloc/vfree問題思考記錄
- 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。
- arm 64 vmalloc/vfree流程
- arm 64 有兩個PGD 寄存器,其中一個存放用戶態的PGD,一個存放內核態的PGD(即init_task的PGD,整個內核空間只有一個PGD);
- 因爲你們都是共用一個PGD,就無所謂的vamlloc fault了,流程也簡單明瞭了
- 問題引伸
- copy_from_usr/copy_to_usr在arm 64如何實現?arm 32因爲內核態用戶態共用一個PGD,即經過簡單的copy便可;
- arm 32理論上來說也是能夠實現用戶態一個PGD,內核態一個PGD,只須要在每次狀態切換時更新PGD便可,那爲什麼不這麼作呢?
- 切換PGD,引發TLB 抖動,如何減小 TLB 抖動?答案是TLB ASID!
歡迎關注本站公眾號,獲取更多信息