2016-03-06 49 views
0

這實際上是一個關於內存管理的理論問題。由於不同的操作系統實現不同的東西,我不得不減輕對知識的渴求,詢問事物如何在其中的一箇中工作:(最好是開放源代碼和廣泛使用的一個:Linux。當進程訪問剛分配給brk/sbrk的地址時,內核會發生什麼?

這裏列出了一些東西我知道在整個拼圖:

  • malloc()是用戶空間的libc負責系統調用作業(調用brk/sbrk/mmap ...)它設法得到的內存大塊,由範圍描述。虛擬地址庫對這些塊進行分片並設法響應用戶應用程序請求
  • 我知道什麼是brk/sbrk系統調用。我知道'節目休息'是什麼意思。這些調用基本上會推送程序中斷偏移量。這就是libc如何獲得其虛擬內存塊。
  • 現在,用戶應用程序有一個新的虛擬地址來操作,它只是寫了一些值。像:*allocated_integer = 5;。好。怎麼辦?如果brk/sbrk只會更新進程表中進程的條目中的偏移量,或者其他什麼,實際分配的物理內存如何?
  • 我知道虛擬內存,頁表,頁面錯誤等,但我想知道這些東西究竟是如何與我描述的這種情況有關。例如:進程的頁表是否被修改?怎麼樣?什麼時候?頁面錯誤發生?什麼時候?爲什麼?有什麼目的?何時調用這個「夥伴算法」,並訪問這個free_area數據結構? (http://www.tldp.org/LDP/tlk/mm/memory.html,部分3.4.1頁面分配
+0

頁表在'sbrk/brk'系統調用中被修改,所以用戶可以合法地訪問內存(沒有分段錯誤)。但出於性能考慮,發生頁面錯誤時會分配物理頁面幀。 –

+0

因此,當您創建/合併VMA時,您實際上創建了PTE?我正在搜索該部分的源代碼,但是當創建PTE時我找不到點... – matheuscscp

+0

請參閱我的答案,'brk'不要更改頁表。檢查[link1](https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/mm/mmap.c#L2739),[link2](https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/毫米/ MMAP。c#L1058)和[link3](https://github.com/torvalds/linux/blob/67944024c1cdd897e49a09b0d6af3ea38d1388ca/mm/mmap.c#L686) – matheuscscp

回答

1

好後,終於找到一個優秀導遊(http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/)和幾個小時挖Linux內核,我找到了答案......

  • 的確,brk只能推動虛擬內存區域。
  • 當用戶應用程序擊中*allocated_integer = 5;時,發生頁面錯誤。
  • page fault routinesearch爲虛擬內存區負責地址,然後call頁表處理程序。
  • page table handler經過每個級別(2級在x86和x86_64的在4級),分配的條目,如果他們不存在(2nd3rd4th),然後最後calls真正的處理程序。
  • real handler實際上callsfunction負責分配頁面幀。
相關問題