簡體   English   中英

在“分叉”進程的同時,為什么Linux內核會為每個新創建的進程復制內核頁表的內容?

[英]While “fork”ing a process, why does Linux kernel copy the content of kernel page table for every newly created process?

以下討論適用於32位ARM Linux內核。

我注意到在分叉過程中,Linux內核將內核頁表(主頁表,即swapper_pg_dir )的內容復制到每個新創建的進程的頁表中。

問題是:

  • 為什么這么做呢?
  • 為什么不能所有進程共享內核頁表的單個副本(關於32位ARM Linux的高1G部分),而不是為每個新創建的進程memcpy交換器頁表?
  • 是浪費記憶嗎?

相關源代碼(“ - >”代表函數調用):
do_fork - > copy_process - > copy_mm - > dup_mm - > mm_init - > mm_alloc_pgd - > pgd_alloc - >

/*
* Copy over the kernel and IO PGD entries
*/
init_pgd = pgd_offset_k(0);

memcpy(new_pgd + USER_PTRS_PER_PGD, init_pgd + USER_PTRS_PER_PGD,
       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));

每個進程都有自己的內核部分頁面表副本(更高的1GB),以避免在切換用戶/內核域時進行L1頁表切換(即避免更新TTBR)。 請注意,用戶/內核切換頻繁發生。

為什么要避免更新TTBR? 詳細信息可以在這里找到: 更新ARM TTBR(翻譯表基址寄存器)的缺點是什么?

共享頁表意味着共享內存空間。 換句話說,它打破了擁有操作系統的重點。 每個流程都有自己的頁面故事。 頁表不占用太多內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM