草庐IT

linux - 虚拟内存和 sbrk

在32位Linux系统上,一个进程最多可以访问4GB的虚拟地址空间;然而,在保留其中任何一项方面,进程似乎在不同程度上是保守的。因此,使用malloc的程序偶尔会通过系统调用sbrk/brk增加其数据段。甚至那些页面还没有在物理内存中声明。我不完全理解的是,为什么我们首先需要sbrk,为什么不直接给我4GB地址空间来避免任何sbrk调用,因为在我们接触/声明这些block之前,它本质上是一个免费操作,对吗? 最佳答案 如果你对文件进行内存映射(在Linux下很常见)会发生什么?它必须位于地址空间中的某个位置,因此必须有一些方法来定义

linux - sbrk/brk 在 Linux 中是如何实现的?

我在考虑Linux内核如何实现系统调用,我想知道是否有人可以给我一个关于sbrk/brk工作原理的高级View?我已经查看了内核代码,但是太多了,我看不懂。我希望得到某人的总结? 最佳答案 在非常高的层次上,Linux内核将进程可见的内存跟踪为多个“内存区域”(structvm_area_struct)。还有一个结构表示(同样在非常高的层次上)一个进程的整个地址空间(structmm_struct)。每个进程(一些内核线程除外)只有一个structmm_struct,它依次指向所有structvm_area_struct,用于它可以

c - 为什么调用 sbrk(0) 两次会给出不同的值?

我正在尝试理解sbrk()函数。据我所知:sbrk(0)返回中断的当前地址并且不增加它。sbrk(size)将中断的地址增加size个字节并返回中断的前一个地址。所以我创建了一些东西来测试它:#include#includeintmain(void){printf("sbrk(0)=%p\n",sbrk(0));//shouldreturnvaluexprintf("sbrk(0)=%p\n",sbrk(0));//shouldreturnvaluexprintf("sbrk(5)=%p\n",sbrk(5));//shouldreturnvaluexprintf("sbrk(0)=%
12