问题标签 [sbrk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
63 浏览

c - 程序仅在第一次运行时挂起?

我正在尝试在 gdb 中调试低级 C 程序。有问题的程序旨在充当包装器,启动另一个进程并监视/干扰其内存使用。

当我在 gdb 中加载程序时,起初一切似乎都很正常(如果不理想的话)。我看到新的进程分叉,然后它挂起。这本身并不会太奇怪。我的代码中某处可能出现死锁或无限循环。

但是,如果我在 gdb 中中断并终止该进程,然后在同一个 gdb 会话中再次运行它,则一切正常。运行大约需要半秒钟,并且完全按照应有的方式运行。

所以我的问题是:gdb 在我的程序运行之间保留了什么?第一次和第二次执行之间会发生什么变化?

0 投票
1 回答
3572 浏览

c - sbrk() 是如何工作的?

我试图了解它是如何sbrk工作的。

这是我的小代码:

这输出:

为什么前 2 个地址之间的差异是 0xac7000 - 0xaa6000 = 21000 而不是 10?

0 投票
1 回答
655 浏览

c - 将 sbrk 拆分为 2

为了重新编码 malloc 函数,我做了一个sbrk(stack)where :

我 malloc 总是比我需要的要多,然后我想取一些分配的大小区域size并返回它,如果我想在我已经分配内存之后再做一次 malloc,所以我不必多次调用 sbrk。我怎么能做到这一点,我试图回去brk(start_of_the_allocated_space)sbrk(size)有我需要的空间的开始和结束,但它有段错误。

编辑:

这是我的结构。然后我有一个创建块的函数

0 投票
1 回答
235 浏览

c - 将 sbrk 的结果分配给指针时的对齐问题 - K&R

引用 Kernighan 和 Ritchie 的代码(第 2 版第 188 页),

这里的问题是当返回的值sbrk类似于 101 时会发生什么,当指针分配到up行中完成时对齐将无效up = (Header*)cp;

这可能有一个非常明显的答案,如果我错过了,非常抱歉!

0 投票
1 回答
376 浏览

c - C - sbrk(size) 返回有效指针但 sbrk(0) 为负值

我的分配代码是

sbrk(...) 函数返回一个有效地址 (0x603021) 但是当我进入 gdb 并打印 sbrk(0) 时,我得到了十六进制值 0xffffffff8060341。经过数学计算,我发现指针 0x8060341 应该是 sbrk(0)。前面的字母f(即0xfffff...)从何而来?

0 投票
1 回答
276 浏览

c - TDM-GCC - 在 Kernighan & Ritchie 的存储分配器实现程序中未定义对 sbrk() 的引用

我试图理解 Kernighan 和 Ritchie 的书“The C Programming Language, 2nd edition”中显示的存储分配器程序。我想我理解得最多,但是当我在Windows 8.1 x86_64 with TDM GCC version 5.1.0. 它输出错误undefined reference to 'sbrk'。这些是我的包括:

我已经搜索了很多,但没有其他答案对我有帮助。它应该在里面unistd.h,但它不是。是不是因为它是系统调用,所以在 Windows 中找不到?怎么了?

0 投票
3 回答
457 浏览

c++ - 为什么虚拟方法会生成对_sbrk 的未定义引用?

这可以优雅地编译:

这抱怨对 _sbrk 的未定义引用:

为什么虚拟方法会生成未定义的引用_sbrk

我曾经认为它vtable是静态分配的,不需要malloc.

编译器:arm-none-eabi-gcc 8.0.0使用最近的newlib. 编译-fno-rtti -fno-exceptions -fno-unwind-tables

测试程序(boot就像main):

0 投票
0 回答
94 浏览

c - 为什么 free() 不会减少程序数据空间

我的理解是 malloc 在内部使用 sbrk() 并且 sbrk(0) 提供指向程序中断当前位置的指针。然后根据以下代码:-

输出是:

但是在调用 free() 之后它应该再次打印37367808而不是打印37502976

0 投票
2 回答
1193 浏览

c - 为什么`alloca`不检查它是否可以分配内存?

为什么不alloca检查它是否可以分配内存?

来自man 3 alloca

如果分配导致堆栈溢出,则程序行为未定义。… 如果堆栈帧无法扩展,则没有错误指示。

为什么alloca不/不能检查它是否可以分配更多内存?

我理解它alloca在堆栈上分配内存时在堆栈上分配内存的方式(s)brk。来自https://en.wikipedia.org/wiki/Data_segment#Heap

堆区由 malloc、calloc、realloc 和 free 管理,可以使用 brk 和 sbrk 系统调用来调整其大小

来自man 3 alloca

alloca() 函数在调用者的堆栈帧中分配 size 个字节的空间。

并且堆栈和堆正朝着收敛的方向增长,如下图所示:

在此处输入图像描述

(上图来自Dougct 在CC BY-SA 3.0下发布的Wikimedia Commons

现在两者都alloca返回(s)brk一个指向新分配内存开头的指针,这意味着它们都必须知道当前堆栈/堆在哪里结束。确实,来自man 2 sbrk

以 0 为增量调用 sbrk() 可用于查找程序中断的当前位置。

因此,按照我的理解,检查是否alloca可以分配所需的内存基本上归结为检查堆栈的当前端和堆的当前端之间是否有足够的空间。如果在堆栈上分配所需的内存会使堆栈到达堆,则分配失败;否则,它会成功。

那么,为什么不能使用这样的代码来检查是否alloca可以分配内存呢?

这对我来说更令人困惑,因为显然(s)brk可以进行此类检查。来自man 2 sbrk

brk() 将数据段的末尾设置为 addr 指定的值,当该值合理时,系统有足够的内存,并且进程不超过其最大数据大小(参见 setrlimit(2))。

所以如果(s)brk可以做这样的检查,那为什么不能alloca呢?

0 投票
1 回答
93 浏览

c - 系统如何知道数据段的结束

2个问题(同一主题):

一些例子 :

假设我在汇编中有类似的东西(GCC编译):

当我将地址-4(%rbp)提供给另一条指令时,系统如何知道在哪里停止?因为-4(%rbp)是起始地址,但我们没有任何关于停止的信息,所以它可能是2x2字节而不是 4 字节。

我的第二个问题有点相同,但考虑到我使用的是sbrk ,所以使用了 heap

当我打电话给sbrk(0)它时,它会给出堆中中断的地址。
假设我正在使用sbrk(20),然后sbrk(40)将移动中断,现在我正在尝试访问分配的空间sbrk(20),与程序集相同,系统如何知道何时停止而不溢出sbrk(40)空间?

也许这有点令人困惑,如果您希望我发展更多,请告诉我。