据我了解programbreak是Linux操作系统为进程分配的最高虚拟内存地址,因此标记堆的最高地址。您可以通过调用sbrk(0)来获取程序中断的地址。当我创建以下简单程序时,每次运行时我都会得到不同的结果:#define_BSD_SOURCE#include#includeintmain(){printf("systembreak:%p\n",sbrk(0));return0;}例如,在我的电脑上:$./sbrksystembreak:0x81fc000$./sbrksystembreak:0x9bce000$./sbrksystembreak:0x97a6000我的理解是,堆是在
我在考虑Linux内核如何实现系统调用,我想知道是否有人可以给我一个关于sbrk/brk工作原理的高级View?我已经查看了内核代码,但是太多了,我看不懂。我希望得到某人的总结? 最佳答案 在非常高的层次上,Linux内核将进程可见的内存跟踪为多个“内存区域”(structvm_area_struct)。还有一个结构表示(同样在非常高的层次上)一个进程的整个地址空间(structmm_struct)。每个进程(一些内核线程除外)只有一个structmm_struct,它依次指向所有structvm_area_struct,用于它可以
根据Linux程序员手册:brk()andsbrk()changethelocationoftheprogrambreak,whichdefinestheendoftheprocess'sdatasegment.这里的数据段是什么意思?只是数据段还是数据、BSS、堆结合?根据维基Datasegment:Sometimesthedata,BSS,andheapareasarecollectivelyreferredtoasthe"datasegment".我认为没有理由只更改数据段的大小。如果是数据,BSS和堆一起,那么这是有道理的,因为堆将获得更多空间。这让我想到了第二个问题。在我到目
根据Linux程序员手册:brk()andsbrk()changethelocationoftheprogrambreak,whichdefinestheendoftheprocess'sdatasegment.这里的数据段是什么意思?只是数据段还是数据、BSS、堆结合?根据维基Datasegment:Sometimesthedata,BSS,andheapareasarecollectivelyreferredtoasthe"datasegment".我认为没有理由只更改数据段的大小。如果是数据,BSS和堆一起,那么这是有道理的,因为堆将获得更多空间。这让我想到了第二个问题。在我到目