CocytusDEDI Asked: 2025-04-03 18:16:23 +0800 CST2025-04-03 18:16:23 +0800 CST 2025-04-03 18:16:23 +0800 CST Linux 内核如何知道将其堆放在哪里? 772 在设置动态内存分配时,Linux 内核必须选择一个位置来放置它的堆,不是吗?它如何避免覆盖自己的堆栈,或者避免堆栈增长后覆盖堆? linux-kernel 1 个回答 Voted Best Answer user10489 2025-04-03T19:58:27+08:002025-04-03T19:58:27+08:00 在像扁平内存模型这样的简单系统中,栈和堆位于空闲内存池的两端,并相互靠近增长。如果内存不足,两者可能会相遇。 当然,Linux 并不使用平面内存模型,无论是在内核还是在进程空间。两者都使用虚拟映射的分页内存(按需分页,供进程使用),因此简单的答案是,堆和栈会在需要时从空闲页面池中分配单独的页面,因此不会出现重叠的情况。由于页面是虚拟映射的,它们实际上可以保持连续性,但实际上却是物理分散的。由于页面地址是虚拟的,因此堆和栈可以被分配相距甚远的虚拟地址,以至于它们实际上永远无法与可用的物理内存相交。
在像扁平内存模型这样的简单系统中,栈和堆位于空闲内存池的两端,并相互靠近增长。如果内存不足,两者可能会相遇。
当然,Linux 并不使用平面内存模型,无论是在内核还是在进程空间。两者都使用虚拟映射的分页内存(按需分页,供进程使用),因此简单的答案是,堆和栈会在需要时从空闲页面池中分配单独的页面,因此不会出现重叠的情况。由于页面是虚拟映射的,它们实际上可以保持连续性,但实际上却是物理分散的。由于页面地址是虚拟的,因此堆和栈可以被分配相距甚远的虚拟地址,以至于它们实际上永远无法与可用的物理内存相交。