问题标签 [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 投票
2 回答
3213 浏览

c - 关于 sbrk() 和 malloc()

我已经彻底阅读了关于 sbrk() 的 linux 手册:

sbrk() 改变程序中断的位置,它定义了进程数据段的结束(即程序中断是未初始化数据段结束后的第一个位置)。

而且我确实知道用户空间内存的组织如下: 在此处输入图像描述

问题是: 当我调用 sbrk(1) 时,为什么它说我正在增加堆的大小?正如手册所说,我正在更改“数据段和 bss”的结束位置。那么,数据段和 bss 的大小应该增加多少,对吗?

0 投票
2 回答
1987 浏览

c - 为什么 malloc(1) 给出的页面大小不止一个?

我曾在我的机器上尝试使用 sbrk(1),然后故意写出测试页面大小,即 4096 字节。但是当我调用 malloc(1) 时,我在访问 135152 字节后得到了 SEGV,这远远超过一页大小。我知道 malloc 是库函数,它依赖于实现,但考虑到它最终会调用 sbrk,为什么它会给出一个以上的页面大小。谁能告诉我它的内部工作?

我的操作系统是 ubuntu 14.04,我的架构是 x86

更新:现在我想知道是否是因为 malloc 将地址返回到一个足够大以容纳我的数据的空闲列表块。但是那个地址可能在堆的中间,这样我就可以继续写,直到达到堆的上限。

0 投票
1 回答
432 浏览

rust - 有没有办法在 Rust 代码中使用 unistd.h 中的函数?

我正在尝试实现 malloc 类型的函数,但我不知道要使用什么来代替 unistd.h 中用于 C 的 sbrk 函数。有没有办法将 unistd.h 转换为 Rust 程序?

0 投票
2 回答
936 浏览

c - 静态库中的 Newlib 存根

我正在使用 Eclipse 开发裸机应用程序。我链接到 newlib,所以我提供了我自己的 _sbrk() 实现。此功能通常包含在我的项目中,并且一切正常。

现在我尝试将此函数移动到我在过去几个月开发的静态库中。

在链接期间,我收到一个undefined reference to _sbrk错误。该文件所在的路径已正确包含在 Eclipse 设置中(同一目录中的其他文件已正确链接)。

显然,链接器通过我的代码的顺序有问题,这个函数被丢弃了。

我尝试使用__attribute__((used)),没有运气。

如何通过 Eclipse 设置克服这个问题?(基于 Makefile 或命令行编译不是我需要的解决方案)。

0 投票
2 回答
644 浏览

linux - 如何找到程序中断的当前位置

我尝试在 brk 系统调用函数中添加它:

但它在内核编译期间返回错误,即隐式声明 sbrk 函数。而且我找不到定义 sbrk 的位置!!我需要测量的是,每当某个用户进程试图扩展它的程序中断地址时,我就会知道它当前的程序中断地址,这样我就可以测量有多少内存进程正在请求。

谢谢你。

0 投票
2 回答
766 浏览

c - 为什么我在 sbrk 之后会遇到无效内存?

我正在尝试使用sbrk系统调用来请求一个内存页面并将该页面分成小块,但我的代码总是会遇到一些无效内存:

就像我得到sbrk(0)了一样0x804d000,之后的绑定sbrk(one_page_size)会是0x8055000,但是代码会在0x804e000.

0 投票
2 回答
350 浏览

c - 多个 malloc 调用在内部只调用一次 mmap

当我尝试下面的代码时,我无法清楚地分析 malloc api 内部调用。我不清楚的是系统调用 mmap 只为 2 个或多个 malloc 调用调用一次。如果我分配的字节数也超过 4069在内部仅调用一个 mmap(使用 strace -p processid 标识跟踪)。

strace 输出:

我正在寻找的是,如果 malloc 使用得更多,那么它会调用一个以上的 mmap,因为内存超过了两个 malloc 超过 4096

0 投票
2 回答
938 浏览

linux - 用 `mmap` 替换 `sbrk`

我读过这sbrk是一个不推荐使用的调用,应该更喜欢mmap使用 MAP_ANONYMOUS标志。我需要一个可以增长的连续(逻辑)内存块。但是,mmap将第一个参数视为提示,因此它可能会产生间隙,这在我的情况下是不可接受的。我尝试使用MAP_FIXED标志(不推荐使用它作为文档状态)并且我可以获得连续的内存,但是在映射了几页之后我的程序出现了奇怪的行为:系统功能printf开始clock_gettime失败。我猜mmap我调用的第一个没有MAP_FIXED返回页面,它后面有一些映射页面,其中包含系统数据。那么正确的使用方法mmapsbrk什么?

0 投票
0 回答
186 浏览

memory-management - 用sbrk减小堆会和数据段冲突吗?

我知道给堆分配过多的空闲内存会和栈发生冲突,但是数据段呢?因为 sbrk 可以与负值一起使用。提前致谢。

0 投票
2 回答
1703 浏览

c - newlib 中的 malloc() :在一次大失败分配后是否会浪费内存?

我正在为 STM32F7 编写嵌入式软件,我的 libc 是 newlib-2.4.0.20160527。

我已经实现_sbrk()如下:

然后,当我执行以下操作时:

一切正常(即 malloc 两次返回非零值)。

但是当我执行以下操作时(出于测试目的):

每个malloc()失败,甚至malloc(0)(即,__BKPT()从未达到)。所以,实际上堆上没有分配的内存(我没有得到任何内存,mem != 0所以我什free()至什么都做不到),也没有可用的内存。

我希望malloc()每一次都失败sz > 0x40000并为每一次成功sz <= 0x40000(假设在每一次free()之后都可以正常工作malloc())。

我错过了什么,或者这是 newlib 中的错误或预期行为?