问题标签 [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.
c - 设置超出程序中断的内存不会出现段错误
我正在尝试了解有关内存管理(mmap、brk、sbrk)的更多信息,我真的很困惑:
不会触发分段错误?我在 OS X Mojave 上用 clang 编译这个。
sbrk() 的手册页说它已被弃用,但它也说 sbrk() 应该可靠地返回程序中断。如果这是真的,并且页面大小是 4096 字节,那么不应该为超出程序中断的 100000 个空格的地址设置一个值会触发段错误吗?如果它不能可靠地返回程序中断(它不能,如果您可以为超出它的地址设置值,对吗?)那么您如何可靠地找到 Mac OS 上的程序中断?
完全相同的代码在 Ubuntu 18.10 上产生了段错误。
谢谢!
gdb - 我可以在 gdb 中获取当前的 sbrk() 限制吗?
我想知道sbrk()
调试我遇到困难的 SEGV 的电流限制是多少。我的代码看起来不错,并且在大多数情况下都有效(SEGV 的很多中断中只有一种情况。)
我认为这可能与在这种情况下我们使用多线程应用程序这一事实有关,但我现在无法确定问题所在。我想将 SEGV 地址与sbrk()
限制进行比较,以查看该地址的偏离程度。我想它可能是一个mmap()
或一些类似的地址,在我的脚下被删除了。
c - brk/sbrk 有什么不安全/遗留问题?
我在很多地方(musl 邮件列表、macOS 论坛等)都听说过brk()
是sbrk()
不安全的。其中很多地方要么根本不解释,要么解释的很模糊。例如,此链接指出“这些功能从根本上被破坏”,并继续说malloc
和sbrk
子系统完全被破坏,它们破坏了堆等。
我的问题是:为什么会这样?如果malloc
以这样的方式使用它分配一个sbrk
足够大的内存块来平息或大大减少对进一步分配的需求,那么使用起来不应该sbrk
并且brk
完全安全吗?
这是我的sbrk
and实现brk
:
sbrk
:
brk
:
c - 为什么 malloc 和 sbrk 从单独的段返回地址?
我试图实现了解动态内存分配是如何发生的。所以我想到了使用sbrk()
系统调用实现我自己的malloc。我的问题是当我尝试分配动态内存时, sbrk() 和 malloc() 返回不连续的不同地址。
这是我的代码
上述代码的输出是
谁能解释为什么sbrk(8)
不是连续的位置。
c - 填充字节是否在内存分配器中被视为已分配或未分配?
我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是已分配内存和未分配内存。有人告诉我,对于一个基本的“幼稚”sbrk()
内存分配器,调用sbrk()
必须提供与 16 字节(的倍数)对齐的大小。这意味着如果我需要分配例如 5 个字节的内存,则应用 (5 + (16-1)) & ~(16-1)) 操作,在这种情况下四舍五入为 16。如果请求的大小是 17 而不是 5,那么它将四舍五入为 32。
这意味着我们从操作系统返回的字节数超过了用户为对齐而请求的字节数。我的问题是,11 个字节(在第一个示例的情况下)或 15 个字节(在第二个示例的情况下)是否被视为“已分配”?在内存分配器的正确实现中,用户实际上是否可以在请求的大小和 16 字节边界之间使用超过请求的字节?如果没有,如何执行?
c - 您是否特别需要 malloc 为链表的新元素分配内存
因此,据我所知, malloc 返回指向堆中某个位置的指针。
sbrk() 将堆扩展至少 4k
如果由于某种原因我不能使用 malloc,如果链表(例如)通过使用 sbrk() 调用获得的具有 4k 的地址,是否可以在 c 中为新成员分配内存,而不是一个malloc?
对不起,如果这是一个 dmub 问题:(
编辑:我不能使用 malloc 的原因是因为我的任务是创建自己的 malloc 并被告知使用 sbrk。
c - 需要以 2 的幂对齐内存,并在 C 中将程序中断对齐 2 * getpagesize() 的倍数
我正在使用 brk、sbrk 和 getpagesize() 重新编码 malloc 函数
我必须遵守两条规则:
1)我必须将我的记忆与 2 的幂对齐
这意味着:如果对 malloc 的调用是: malloc(9); 我必须返回一个 16 字节的块。(最接近 2 的幂);
2)我必须在 2 页的倍数上对齐中断(程序结束数据段)。
我正在考虑规则,我想知道我是否真实;
规则 1)我只需要返回我的 malloc(所以 malloc 以六进制返回的地址)为 2 的倍数?
对于规则 2)
如果我没记错的话,中断是堆中的最后一个地址,我是否需要像这样设置中断(中断 - 堆开始)%(2 * getpagesize())== 0?或者只是 break % (2 * getpagesize() == 0?谢谢
c - printf 使用 sbrk,与自定义内存分配器冲突
嗨,我写了一个内存分配器,效果很好。我使用 sbrk/brk 进行页面分配和释放。但这一切都在我开始使用 printfs 打印信息的那一刻中断。谷歌搜索表明 - printf 在内部也确实使用了 sbrk。因此,另一个 glibc 函数 (printf) 意外地使用了 sbrk 修改的堆段 - 破坏了内存分配器正在执行的簿记。
参考:基本上调用 printf 后 sbrk(0) 值会增加 ,任何其他使用 sbrk 的 glibc 函数都会破坏我的内存分配器。你能建议什么可能的解决方案吗?
粘贴下面的回溯,显示 printf 最终调用了 sbrk。即使在打印完成后,我看到,中断指针也永远不会恢复到它的原始点。printf 不应该已经恢复了它最初在堆段中的中断指针吗?在这方面可以替代 printf 吗?
posix - 如何释放 sbrk() 分配的内存?我可以使用 munmap 吗?
我很难理解sbrk()
和mmap()
,以及munmap()
。
这与如何释放 sbrk() 获得的内存密切相关?但我还有更多问题。
如果我有以下程序:
据我了解,sbrk()
将通过传入的值增加堆的大小,然后返回指向该内存段开头的指针。
因此,例如,如果当前堆中断(堆结束)在 0x1000,并且我调用void* first = sbrk(4096)
,那么堆中断将在 0x2000 并且返回的指针将是 0x1000。
所以我假设当我调用时void* second = sbrk(4096)
,堆中断将在 0x3000 并且返回的指针将是 0x2000?
说到释放这块内存,我知道如果你sbrk()
再次调用,我认为 sbrk(-4096) 会释放堆内存。但是那不是void* second
免费的吗,如果我想免费void* first
怎么办?
另外,我可以使用 munmap 取消映射分配的内存sbrk()
吗?所以调用类似的东西,munmap(second, 4096);
或者只能在我用来mmap()
分配内存的情况下使用?
谢谢,胡安
请注意,这是大学作业,我只会使用 malloc 和 free,但作业是重新实现 malloc。
c - 在循环中调用malloc后程序中断没有改变?
运行这段代码应该会导致程序中断增加大约malloc_counts * _SC_PAGESIZE
而不是我每次都得到固定的程序中断,所以这是为什么。malloc 应该调用brk
或sbrk
将其本身向上舍入传递到下一页(需要一些额外的工作)。那么发生了什么?