malloc 何时处理从虚拟地址到物理地址的映射?

Posted

技术标签:

【中文标题】malloc 何时处理从虚拟地址到物理地址的映射?【英文标题】:When does malloc handle the mapping from virtual address to physics one? 【发布时间】:2021-11-22 02:38:21 【问题描述】:

我正在尝试学习 Linux 内存管理。但是malloc 的行为让我很困惑。

之前,我虽然 malloc() 只是设置了 vma 范围,所以应用程序可以访问这些虚拟地址。当它们第一次被触摸时,handle_mm_fault 将最终处理与do_anonymous_page 的映射。

但是我做了一个exp发现好像不对。我使用一个 c 应用程序来malloc 2GB 内存(总共 524,288 页)并遍历它。使用kretprobe,我刚被handle_mm_fault 打断了大约2000 次,但没有524,288 个页面。

那么,什么时候在malloc中进行虚拟地址到物理地址的映射?


一些细节:

内核:Linux 4.11.0

gcc : gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609


调用 do_anonymous_page 时的 ***:

PID virtual address diff with pre
17562   7f40ac54b000    
17562   7f40ac54c000    4096
17562   7f40ac54d000    4096
17562   7f40ac54e000    4096
17562   7f40ac54f000    4096
17562   7f40ac550000    4096
17562   7f40ac551000    4096
17562   7f40ac552000    4096
17562   7f40ac553000    4096
17562   7f40ac554000    4096
17562   7f40ac555000    4096
17562   7f40ac556000    4096
17562   7f40ac557000    4096
17562   7f40ac558000    4096
17562   7f40ac559000    4096
17562   7f40ac55a000    4096
17562   7f40ac55b000    4096
17562   7f40ac55c000    4096
17562   7f40ac55d000    4096
17562   7f40ac55e000    4096
17562   7f40ac55f000    4096
17562   7f40ac560000    4096
17562   7f40ac561000    4096
17562   7f40ac562000    4096
17562   7f40ac563000    4096
17562   7f40ac564000    4096
17562   7f40ac565000    4096
17562   7f40ac566000    4096
17562   7f40ac567000    4096
17562   7f40ac568000    4096
17562   7f40ac569000    4096
17562   7f40ac56a000    4096
17562   7f40ac56b000    4096
17562   7f40ac56c000    4096
17562   7f40ac56d000    4096
17562   7f40ac56e000    4096
17562   7f40ac56f000    4096
17562   7f40ac570000    4096
17562   7f40ac571000    4096
17562   7f40ac572000    4096
17562   7f40ac573000    4096
17562   7f40ac574000    4096
17562   7f40ac575000    4096
17562   7f40ac576000    4096
17562   7f40ac577000    4096
17562   7f40ac578000    4096
17562   7f40ac579000    4096
17562   7f40ac57a000    4096
17562   7f40ac57b000    4096
17562   7f40ac57c000    4096
17562   7f40ac57d000    4096
17562   7f40ac57e000    4096
17562   7f40ac57f000    4096
17562   7f40ac580000    4096
17562   7f40ac581000    4096
17562   7f40ac582000    4096
17562   7f40ac583000    4096
17562   7f40ac584000    4096
17562   7f40ac585000    4096
17562   7f40ac586000    4096
17562   7f40ac587000    4096
17562   7f40ac588000    4096
17562   7f40ac589000    4096
17562   7f40ac58a000    4096
17562   7f40ac58b000    4096
17562   7f40ac58c000    4096
17562   7f40ac58d000    4096
17562   7f40ac58e000    4096
17562   7f40ac58f000    4096
17562   7f40ac590000    4096
17562   7f40ac591000    4096
17562   7f40ac592000    4096
17562   7f40ac593000    4096
17562   7f40ac594000    4096
17562   7f40ac595000    4096
17562   7f40ac596000    4096
17562   7f40ac597000    4096
17562   7f40ac598000    4096
17562   7f40ac599000    4096
17562   7f40ac59a000    4096
17562   7f40ac59b000    4096
17562   7f40ac59c000    4096
17562   7f40ac59d000    4096
17562   7f40ac59e000    4096
17562   7f40ac59f000    4096
17562   7f40ac5a0000    4096
17562   7f40ac5a1000    4096
17562   7f40ac5a2000    4096
17562   7f40ac5a3000    4096
17562   7f40ac5a4000    4096
17562   7f40ac5a5000    4096
17562   7f40ac5a6000    4096
17562   7f40ac5a7000    4096
17562   7f40ac5a8000    4096
17562   7f40ac5a9000    4096
17562   7f40ac5aa000    4096
17562   7f40ac5ab000    4096
17562   7f40ac5ac000    4096
17562   7f40ac5ad000    4096
17562   7f40ac5ae000    4096
17562   7f40ac5af000    4096
17562   7f40ac5b0000    4096
17562   7f40ac5b1000    4096
17562   7f40ac5b2000    4096
17562   7f40ac5b3000    4096
17562   7f40ac5b4000    4096
17562   7f40ac5b5000    4096
17562   7f40ac5b6000    4096
17562   7f40ac5b7000    4096
17562   7f40ac5b8000    4096
17562   7f40ac5b9000    4096
17562   7f40ac5ba000    4096
17562   7f40ac5bb000    4096
17562   7f40ac5bc000    4096
17562   7f40ac5bd000    4096
17562   7f40ac5be000    4096
17562   7f40ac5bf000    4096
17562   7f40ac5c0000    4096
17562   7f40ac5c1000    4096
17562   7f40ac5c2000    4096
17562   7f40ac5c3000    4096
17562   7f40ac5c4000    4096
17562   7f40ac5c5000    4096
17562   7f40ac5c6000    4096
17562   7f40ac5c7000    4096
17562   7f40ac5c8000    4096
17562   7f40ac5c9000    4096
17562   7f40ac5ca000    4096
17562   7f40ac5cb000    4096
17562   7f40ac5cc000    4096
17562   7f40ac5cd000    4096
17562   7f40ac5ce000    4096
17562   7f40ac5cf000    4096
17562   7f40ac5d0000    4096
17562   7f40ac5d1000    4096
17562   7f40ac5d2000    4096
17562   7f40ac5d3000    4096
17562   7f40ac5d4000    4096
17562   7f40ac5d5000    4096
17562   7f40ac5d6000    4096
17562   7f40ac5d7000    4096
17562   7f40ac5d8000    4096
17562   7f40ac5d9000    4096
17562   7f40ac5da000    4096
17562   7f40ac5db000    4096
17562   7f40ac5dc000    4096
17562   7f40ac5dd000    4096
17562   7f40ac5de000    4096
17562   7f40ac5df000    4096
17562   7f40ac5e0000    4096
17562   7f40ac5e1000    4096
17562   7f40ac5e2000    4096
17562   7f40ac5e3000    4096
17562   7f40ac5e4000    4096
17562   7f40ac5e5000    4096
17562   7f40ac5e6000    4096
17562   7f40ac5e7000    4096
17562   7f40ac5e8000    4096
17562   7f40ac5e9000    4096
17562   7f40ac5ea000    4096
17562   7f40ac5eb000    4096
17562   7f40ac5ec000    4096
17562   7f40ac5ed000    4096
17562   7f40ac5ee000    4096
17562   7f40ac5ef000    4096
17562   7f40ac5f0000    4096
17562   7f40ac5f1000    4096
17562   7f40ac5f2000    4096
17562   7f40ac5f3000    4096
17562   7f40ac5f4000    4096
17562   7f40ac5f5000    4096
17562   7f40ac5f6000    4096
17562   7f40ac5f7000    4096
17562   7f40ac5f8000    4096
17562   7f40ac5f9000    4096
17562   7f40ac5fa000    4096
17562   7f40ac5fb000    4096
17562   7f40ac5fc000    4096
17562   7f40ac5fd000    4096
17562   7f40ac5fe000    4096
17562   7f40ac5ff000    4096
17562   7f412c400000    2145390592
17562   7f412c401000    4096
17562   7f412c402000    4096
17562   7f412c403000    4096
17562   7f412c404000    4096
17562   7f412c405000    4096
17562   7f412c406000    4096
17562   7f412c407000    4096
17562   7f412c408000    4096
17562   7f412c409000    4096
17562   7f412c40a000    4096
17562   7f412c40b000    4096
17562   7f412c40c000    4096
17562   7f412c40d000    4096
17562   7f412c40e000    4096
17562   7f412c40f000    4096
17562   7f412c410000    4096
17562   7f412c411000    4096
17562   7f412c412000    4096
17562   7f412c413000    4096
17562   7f412c414000    4096
17562   7f412c415000    4096
17562   7f412c416000    4096
17562   7f412c417000    4096
17562   7f412c418000    4096
17562   7f412c419000    4096
17562   7f412c41a000    4096
17562   7f412c41b000    4096
17562   7f412c41c000    4096
17562   7f412c41d000    4096
17562   7f412c41e000    4096
17562   7f412c41f000    4096
17562   7f412c420000    4096
17562   7f412c421000    4096
17562   7f412c422000    4096
17562   7f412c423000    4096
17562   7f412c424000    4096
17562   7f412c425000    4096
17562   7f412c426000    4096
17562   7f412c427000    4096
17562   7f412c428000    4096
17562   7f412c429000    4096
17562   7f412c42a000    4096
17562   7f412c42b000    4096
17562   7f412c42c000    4096
17562   7f412c42d000    4096
17562   7f412c42e000    4096
17562   7f412c42f000    4096
17562   7f412c430000    4096
17562   7f412c431000    4096
17562   7f412c432000    4096
17562   7f412c433000    4096
17562   7f412c434000    4096
17562   7f412c435000    4096
17562   7f412c436000    4096
17562   7f412c437000    4096
17562   7f412c438000    4096
17562   7f412c439000    4096
17562   7f412c43a000    4096
17562   7f412c43b000    4096
17562   7f412c43c000    4096
17562   7f412c43d000    4096
17562   7f412c43e000    4096
17562   7f412c43f000    4096
17562   7f412c440000    4096
17562   7f412c441000    4096
17562   7f412c442000    4096
17562   7f412c443000    4096
17562   7f412c444000    4096
17562   7f412c445000    4096
17562   7f412c446000    4096
17562   7f412c447000    4096
17562   7f412c448000    4096
17562   7f412c449000    4096
17562   7f412c44a000    4096
17562   7f412c44b000    4096
17562   7f412c44c000    4096
17562   7f412c44d000    4096
17562   7f412c44e000    4096
17562   7f412c44f000    4096
17562   7f412c450000    4096
17562   7f412c451000    4096
17562   7f412c452000    4096
17562   7f412c453000    4096
17562   7f412c454000    4096
17562   7f412c455000    4096
17562   7f412c456000    4096
17562   7f412c457000    4096
17562   7f412c458000    4096
17562   7f412c459000    4096
17562   7f412c45a000    4096
17562   7f412c45b000    4096
17562   7f412c45c000    4096
17562   7f412c45d000    4096
17562   7f412c45e000    4096
17562   7f412c45f000    4096
17562   7f412c460000    4096
17562   7f412c461000    4096
17562   7f412c462000    4096
17562   7f412c463000    4096
17562   7f412c464000    4096
17562   7f412c465000    4096
17562   7f412c466000    4096
17562   7f412c467000    4096
17562   7f412c468000    4096
17562   7f412c469000    4096
17562   7f412c46a000    4096
17562   7f412c46b000    4096
17562   7f412c46c000    4096
17562   7f412c46d000    4096
17562   7f412c46e000    4096
17562   7f412c46f000    4096
17562   7f412c470000    4096
17562   7f412c471000    4096
17562   7f412c472000    4096
17562   7f412c473000    4096
17562   7f412c474000    4096
17562   7f412c475000    4096
17562   7f412c476000    4096
17562   7f412c477000    4096
17562   7f412c478000    4096
17562   7f412c479000    4096
17562   7f412c47a000    4096
17562   7f412c47b000    4096
17562   7f412c47c000    4096
17562   7f412c47d000    4096
17562   7f412c47e000    4096
17562   7f412c47f000    4096
17562   7f412c480000    4096
17562   7f412c481000    4096
17562   7f412c482000    4096
17562   7f412c483000    4096
17562   7f412c484000    4096
17562   7f412c485000    4096
17562   7f412c486000    4096
17562   7f412c487000    4096
17562   7f412c488000    4096
17562   7f412c489000    4096
17562   7f412c48a000    4096
17562   7f412c48b000    4096
17562   7f412c48c000    4096
17562   7f412c48d000    4096
17562   7f412c48e000    4096
17562   7f412c48f000    4096
17562   7f412c490000    4096
17562   7f412c491000    4096
17562   7f412c492000    4096
17562   7f412c493000    4096
17562   7f412c494000    4096
17562   7f412c495000    4096
17562   7f412c496000    4096
17562   7f412c497000    4096
17562   7f412c498000    4096
17562   7f412c499000    4096
17562   7f412c49a000    4096
17562   7f412c49b000    4096
17562   7f412c49c000    4096
17562   7f412c49d000    4096
17562   7f412c49e000    4096
17562   7f412c49f000    4096
17562   7f412c4a0000    4096
17562   7f412c4a1000    4096
17562   7f412c4a2000    4096
17562   7f412c4a3000    4096
17562   7f412c4a4000    4096
17562   7f412c4a5000    4096
17562   7f412c4a6000    4096
17562   7f412c4a7000    4096
17562   7f412c4a8000    4096
17562   7f412c4a9000    4096
17562   7f412c4aa000    4096
17562   7f412c4ab000    4096
17562   7f412c4ac000    4096
17562   7f412c4ad000    4096
17562   7f412c4ae000    4096
17562   7f412c4af000    4096
17562   7f412c4b0000    4096
17562   7f412c4b1000    4096
17562   7f412c4b2000    4096
17562   7f412c4b3000    4096
17562   7f412c4b4000    4096
17562   7f412c4b5000    4096
17562   7f412c4b6000    4096
17562   7f412c4b7000    4096
17562   7f412c4b8000    4096
17562   7f412c4b9000    4096
17562   7f412c4ba000    4096
17562   7f412c4bb000    4096
17562   7f412c4bc000    4096
17562   7f412c4bd000    4096
17562   7f412c4be000    4096
17562   7f412c4bf000    4096
17562   7f412c4c0000    4096
17562   7f412c4c1000    4096
17562   7f412c4c2000    4096
17562   7f412c4c3000    4096
17562   7f412c4c4000    4096
17562   7f412c4c5000    4096
17562   7f412c4c6000    4096
17562   7f412c4c7000    4096
17562   7f412c4c8000    4096
17562   7f412c4c9000    4096
17562   7f412c4ca000    4096
17562   7f412c4cb000    4096
17562   7f412c4cc000    4096
17562   7f412c4cd000    4096
17562   7f412c4ce000    4096
17562   7f412c4cf000    4096
17562   7f412c4d0000    4096
17562   7f412c4d1000    4096
17562   7f412c4d2000    4096
17562   7f412c4d3000    4096
17562   7f412c4d4000    4096
17562   7f412c4d5000    4096
17562   7f412c4d6000    4096
17562   7f412c4d7000    4096
17562   7f412c4d8000    4096
17562   7f412c4d9000    4096
17562   7f412c4da000    4096
17562   7f412c4db000    4096
17562   7f412c4dc000    4096
17562   7f412c4dd000    4096
17562   7f412c4de000    4096
17562   7f412c4df000    4096
17562   7f412c4e0000    4096
17562   7f412c4e1000    4096
17562   7f412c4e2000    4096
17562   7f412c4e3000    4096
17562   7f412c4e4000    4096
17562   7f412c4e5000    4096
17562   7f412c4e6000    4096
17562   7f412c4e7000    4096
17562   7f412c4e8000    4096
17562   7f412c4e9000    4096
17562   7f412c4ea000    4096
17562   7f412c4eb000    4096
17562   7f412c4ec000    4096
17562   7f412c4ed000    4096
17562   7f412c4ee000    4096
17562   7f412c4ef000    4096
17562   7f412c4f0000    4096
17562   7f412c4f1000    4096
17562   7f412c4f2000    4096
17562   7f412c4f3000    4096
17562   7f412c4f4000    4096
17562   7f412c4f5000    4096
17562   7f412c4f6000    4096
17562   7f412c4f7000    4096
17562   7f412c4f8000    4096
17562   7f412c4f9000    4096
17562   7f412c4fa000    4096
17562   7f412c4fb000    4096
17562   7f412c4fc000    4096
17562   7f412c4fd000    4096
17562   7f412c4fe000    4096
17562   7f412c4ff000    4096
17562   7f412c500000    4096
17562   7f412c501000    4096
17562   7f412c502000    4096
17562   7f412c503000    4096
17562   7f412c504000    4096
17562   7f412c505000    4096
17562   7f412c506000    4096
17562   7f412c507000    4096
17562   7f412c508000    4096
17562   7f412c509000    4096
17562   7f412c50a000    4096
17562   7f412c50b000    4096
17562   7f412c50c000    4096
17562   7f412c50d000    4096
17562   7f412c50e000    4096
17562   7f412c50f000    4096
17562   7f412c510000    4096
17562   7f412c511000    4096
17562   7f412c512000    4096
17562   7f412c513000    4096
17562   7f412c514000    4096
17562   7f412c515000    4096
17562   7f412c516000    4096
17562   7f412c517000    4096
17562   7f412c518000    4096
17562   7f412c519000    4096
17562   7f412c51a000    4096
17562   7f412c51b000    4096
17562   7f412c51c000    4096
17562   7f412c51d000    4096
17562   7f412c51e000    4096
17562   7f412c51f000    4096
17562   7f412c520000    4096
17562   7f412c521000    4096
17562   7f412c522000    4096
17562   7f412c523000    4096
17562   7f412c524000    4096
17562   7f412c525000    4096
17562   7f412c526000    4096
17562   7f412c527000    4096
17562   7f412c528000    4096
17562   7f412c529000    4096
17562   7f412c52a000    4096
17562   7f412c52b000    4096
17562   7f412c52c000    4096
17562   7f412c52d000    4096
17562   7f412c52e000    4096
17562   7f412c52f000    4096
17562   7f412c530000    4096
17562   7f412c531000    4096
17562   7f412c532000    4096
17562   7f412c533000    4096
17562   7f412c534000    4096
17562   7f412c535000    4096
17562   7f412c536000    4096
17562   7f412c537000    4096
17562   7f412c538000    4096
17562   7f412c539000    4096
17562   7f412c53a000    4096
17562   7f412c53b000    4096
17562   7f412c53c000    4096
17562   7f412c53d000    4096
17562   7f412c53e000    4096
17562   7f412c53f000    4096
17562   7f412c540000    4096
17562   7f412c541000    4096
17562   7f412c542000    4096
17562   7f412c543000    4096
17562   7f412c544000    4096
17562   7f412c545000    4096
17562   7f412c546000    4096
17562   7f412c547000    4096
17562   7f412c548000    4096
17562   7f412c549000    4096
17562   7f412c54a000    4096
17562   7f412c54b000    4096

【问题讨论】:

页面是通过称为“页面表”的多级树状结构访问的。此外,Linux 内核有多个“前瞻”机制来检测进程是否正在访问连续页面并提前填充条目以提高性能 尝试以某种随机顺序遍历它。它应该混淆任何前瞻机制。然后检查中断计数 看起来不像问题。我尝试在 do_anonymous_page 发生时打印 ***,它是线性的,没有步幅,但在中间找到了一个断点(如 )。我仍在试图找出发生了什么问题。 @pavilion:您应该能够将日志作为 text 而不是 image 粘贴到问题帖子中。请这样做:在 Stack Overflow 上不鼓励使用带有文本的图像,请参阅 How to Ask。如果日志很长,您可以将其中的 部分粘贴到问题中,您认为这与问题相关。 对此我很抱歉。如果没有文件上传功能,我只是找不到如何正确发布它。我想我现在已经修好了。 【参考方案1】:

malloc 只是告诉操作系统您想要一个该大小的块。当您实际访问内存时,映射由操作系统完成。 似乎您的操作系统实际上映射了 1 MB 的块 --> 因此 2 gig 有 2000 个中断。

【讨论】:

这不太可能,大页面是一种稀缺资源。使用它比简单的malloc() 需要更多的努力 不太可能。大多数 do_anonymous_page 地址是线性的。正如我所附。 (图片,因为我似乎无法发送日志文件)【参考方案2】:

我找到了原因。那是因为使用了Transparent Huge Pages。

似乎Linux会自动将中间部分视为huge page,这就是为什么我在do_anonymous_page中丢失了中间对齐部分的页面错误,而未对齐的部分,例如第一个和最后一个将进去吧。

禁用THP 后,我可以得到do_anonymous_page 中的所有524288 故障。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于malloc 何时处理从虚拟地址到物理地址的映射?的主要内容,如果未能解决你的问题,请参考以下文章

malloc内存分配原理 [linux]--mallocbrkmmap

malloc内存分配原理 [linux]--mallocbrkmmap

Linux 内核 内存管理内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

访问映射到同一物理地址的虚拟地址是否会受到惩罚?

cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?

linux内核内存虚拟地址映射物理地址