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

c - (char*)-1 是什么意思?

我想知道它(char*)-1是什么意思,它的评价是什么?
它是sbrk()发生错误时的返回值。

0 投票
0 回答
205 浏览

linux - 使用 sbrk 写入分配的内存会导致段错误

我正在尝试分配内存,sys_brk这是程序:

linux手册中所述

sbrk()以递增字节递增程序的数据空间。以 0 为增量调用sbrk()可用于查找程序中断的当前位置。

运行程序时出现段错误。segfaulted之前的寄存器内容mov是:

我还尝试rax按如下方式递减该值:

现在,我有点困惑如何使用sys_brk返回值。我从这里拿走了它。我也尝试使用 value inrcx但无论如何都会出现段错误。

0 投票
1 回答
518 浏览

c - 什么是内存中的程序中断?

我正在阅读一篇关于为指针分配空间的文章,该文章并未确切说明“程序中断”是什么,但提到了它。我需要知道程序中断是什么。如果我用 malloc 创建一个指向内存空间的指针..IE

PROGRAM BREAK 是开始还是结束?是 p[0] 还是 p[99] 的地址 THX

0 投票
1 回答
577 浏览

linux - sys_brk 的对齐要求是什么

我正在使用 sys_brk 系统调用在堆中动态分配内存。我注意到在获取当前中断位置时,我通常会得到类似于以下的值:

结果是

该值通常以 512 字节对齐。所以想问一下break值有一些对齐要求吗?或者我们可以按照我们想要的方式错位它?

0 投票
0 回答
652 浏览

linux - sys_brk 调用返回什么?

你能解释一下什么是程序断点以及在 x86-64 架构上的 Linux 中 sys_brk 调用返回什么。我曾经认为程序的断点是程序地址空间中最后一个有效地址。如果我想扩展它,我必须调用 brk syscall 并为其提供新的断点地址。如果成功,我会取回新的断点,它可能比请求的要大,因为 linux 是按页面操作的。但是我对一些简单代码的行为感到困惑。

首先,我得到了当前的 brk,然后我尝试将它扩展 8 个字节。然后我又得到了当前的 brk。之后,我尝试访问新 brk 上方的内存。结果如下:

如您所见,首先我得到了 22466560 作为当前的 brk;然后 brk 完全按照要求移至 22466568 ;但是linux通常是按页面操作的,所以我又调用了一次brk(0)来检查真正的当前brk,我又得到了22466568。之后我尝试访问高于 22466568 的内存。我只在 22470385 上遇到分段错误。所以我可以访问 brk 上方的 3817 字节(22470385 - 22466568)。

我的问题是为什么我可以访问高于 brk 的内存以及如何获得真正的 brk 点?谢谢。

0 投票
1 回答
532 浏览

c - 导入 unistd.h 后,编译器声明 sbrk() 是一个隐式声明。为什么是这样?

我正在尝试malloc在 CentOS 上实现,但我不断收到错误消息:

这是编译器警告引用的代码:

根据关于 的文档sbrk,您应该只需要 import unistd.h,我就是这样做的。有什么我做错了吗?

0 投票
1 回答
536 浏览

c - 需要在 C 中实现 malloc 和 free 的建议

对于学校,我需要编写一个使用我自己的 malloc 和 free 实现的程序。我需要能够报告我的“堆”中的所有内存块,无论它是否已分配。我觉得我已经编写了很好的代码来做到这一点,但显然不是。在我运行它的前几次,报告一直在报告同一个地址。在尝试调试时,程序甚至不允许我开始分配空间以用作我的“堆”,它只会出现分段错误并退出。任何关于我哪里出错的指针,甚至是清理我的代码,都会非常有帮助。

0 投票
0 回答
105 浏览

c - 如何找到堆栈在C中的结束位置

作为个人项目,我想使用 sbrk(不是 mmap)在 C 中编写自己的 malloc 实现。我知道我可以使用 sbrk(0) 来确定数据段的结束,这将标志着我的堆的结束。但是,我想准确地让我的 malloc 返回 NULL,而不是让我的堆溢出到堆栈中。有没有一种方法可以用来确定堆栈在哪里结束以检测这种情况?

0 投票
1 回答
1358 浏览

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

我试图理解这个sbrk()功能。

据我所知:
sbrk(0)返回中断的当前地址并且不增加它。
sbrk(size)以字节为单位增加中断的地址size并返回中断的前一个地址。

所以我创建了一些东西来测试它:

所以我期待看到这样的结果:

但相反,我得到了这个:

为什么前两个调用不sbrk(0)返回相同的值?这两个更改中断地址的调用之间会发生什么?

编辑: 在变量中存储地址可以解决问题:

0 投票
1 回答
562 浏览

c - 为什么第一个 sbrk 的返回值与后续调用不同?

我试图了解内存在 C 中是如何工作的,所以现在正在尝试这个sbrk函数。我知道sbrk(0)应该返回当前的程序中断,即数据段的结束。

所以我尝试sbrk(0)多次调用,由于某种原因,我得到的第一个值与其他值不同。例如,这个程序

给我以下输出:

不确定为什么第一个值与其他三个值不同,有什么想法吗?