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頁面分配)
頁表在'sbrk/brk'系統調用中被修改,所以用戶可以合法地訪問內存(沒有分段錯誤)。但出於性能考慮,發生頁面錯誤時會分配物理頁面幀。 –
因此,當您創建/合併VMA時,您實際上創建了PTE?我正在搜索該部分的源代碼,但是當創建PTE時我找不到點... – matheuscscp
請參閱我的答案,'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