问题标签 [brk]

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 投票
4 回答
17203 浏览

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

我在考虑 Linux 内核是如何实现系统调用的,我想知道是否有人可以给我一个关于 sbrk/brk 工作原理的高级视图?

我已经查看了内核代码,但是其中有很多,我不明白。我希望有人提供摘要?

0 投票
2 回答
653 浏览

memory-management - 当 brk 减少然后再次增加时,Linux 内核是否清除了内存?

我只是想知道用户程序通过 brk 系统调用释放的内存会发生什么,然后又回来了。内核是否将其清除或内容未定义?

我相信内核在通过 brk 新分配页面时会清除它们,但是如果返回该页面,然后再次请求返回,我无法确定是否将它们全部归零。我正在浏览 lxr.linux.no 试图找出答案。我也会看看这篇文章中建议的书。

感谢您的回复。

蒂姆

0 投票
4 回答
6813 浏览

c - 什么是程序中断?它从哪里开始,0x00?

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

什么是程序中断?它从哪里开始,0x00?

0 投票
2 回答
4899 浏览

c - brk 和 sbrk 代表什么?

虽然我知道 Unix 系统调用brk和函数的作用sbrk,但我不知道它们代表什么。任何人都可以启发我吗?

0 投票
8 回答
108122 浏览

c - brk() 系统调用有什么作用?

根据Linux程序员手册:

brk() 和 sbrk() 改变程序中断的位置,它定义了进程数据段的结束。

这里的数据段是什么意思?只是数据段还是数据、BSS、堆结合?

根据维基数据段

有时数据、BSS 和堆区域统称为“数据段”。

我认为没有理由只更改数据段的大小。如果是数据、BSS和堆,那么它是有意义的,因为堆将获得更多空间。

这让我想到了第二个问题。在我到目前为止阅读的所有文章中,作者都​​说堆向上增长,堆栈向下增长。但是他们没有解释的是当堆占据堆和栈之间的所有空间时会发生什么?

在此处输入图像描述

0 投票
1 回答
526 浏览

linux - 内核源——在哪个文件中定义了 brk()

我想知道在内核源代码版本 >= 2.6 中brk定义的位置。那是哪个c文件包含它的定义?grep没有透露太多。也在sbrkglibc中实现正确吗?

0 投票
1 回答
596 浏览

c - 关于我首先拟合 malloc 函数的方法的意见和建议

我正在为大学作业编写 malloc 函数。这是我的想法的基本布局:

1)定义一个节点结构,其中包含指向前一个节点、下一个节点的指针,以及一个用于大小和空缺的字符。堆中的每个区域都将包含一个带有此信息的隐藏节点。

2)malloc函数。从第一个节点循环开始,通过每个节点检查空缺。如果一个节点是空的并且足够大,则将一个 ptr 返回到不包括该节点的区域的开头。如果没有可用空间,请使用 sbrk 为节点分配请求的空间 PLUS 空间。

3)自由功能。转到作为参数sizeof(结构节点)传递的指针并将空缺设置为空缺。然后从列表的开头开始,遍历列表合并相邻的空闲空间。

这种方法听起来如何?我主要关心的是实际启动链表。例如,在开始进行任何分配并将 ptr 作为全局变量存储到它之前,是否应该使用 sbrk 创建一个节点?如果是这样,在允许驱动程序调用 malloc 函数之前如何初始化第一个节点?

提前致谢。我不是要求有人编写我的代码,只是为了提供一些关于我的想法的见解和建议。

0 投票
4 回答
948 浏览

segmentation-fault - brk 调用后的 x86_64 printf 段错误

当我尝试使用 brk (int 0x80 with 45 in %rax) 在汇编中实现一个简单的内存管理器程序并按顺序打印块时,我一直遇到段错误。过了一会儿,我只能重现错误,但不知道为什么会这样:

在此处的示例中,如果注释行未注释,则我有段错误,但某些命令(如 de movq $0, %rax)工作正常。在我的另一个程序中,前几个 printf 工作,但第三个崩溃...寻找其他问题,我听说 printf 有时会分配一些内存,并且不应该使用 brk,因为在这种情况下它会破坏堆或者什么...我很困惑,有人知道吗?

编辑:我刚刚发现要让 printf 工作,你需要 %rax=0。

0 投票
1 回答
342 浏览

posix - 使用 brk 获取 brk_start

int brk(void *end_data_segment) 手册;说:“brk() 将数据段的结尾设置为 end_data_segment 指定的值”

成功时返回 0,否则返回 -1。

但是如何获得我的中断的初始值(如 sbrk(0))?

此致,

0 投票
4 回答
5336 浏览

linux - 汇编 x86 brk() 调用使用

我正在尝试将内存动态分配到堆中,然后在这些内存地址中分配值。我了解如何分配内存,但是我如何将例如寄存器中的值分配给第一个动态内存地址?这是我到目前为止所拥有的:

mov例如,我rax会怎么做brk_firstLocation