Linux sbrk() 作为汇编中的系统调用

Jon*_*don 5 linux assembly system-calls sbrk

因此,作为一项挑战,为了提高性能,我正在用汇编语言编写一个简单的服务器。我知道的唯一方法是通过系统调用。(通过 int 0x80)显然,我将需要比在汇编或加载时分配的内存更多的内存,所以我阅读并决定我想使用 sbrk(),主要是因为我不理解 mmap() :p

无论如何,Linux不为sbrk()提供中断,只为brk()提供中断。

那么...如何找到当前程序中断以使用brk()?我考虑过使用 getrlimit(),但我不知道如何获取资源(我猜的进程 ID)来传递给 getrlimit()。或者我应该找到其他方法来实现 sbrk() ?

Ran*_*832 4

sbrk函数可以通过获取当前值并手动减去所需的量来实现。有些系统允许您使用 获取当前值brk(0),其他系统则在变量中跟踪它[该变量使用 的地址初始化_end,该地址由链接器设置为指向初始中断值]。

这是一个非常特定于平台的事情,所以 YMMV。

编辑:在Linux上:

然而,实际的 Linux 系统调用成功时会返回新的程序中断。失败时,系统调用返回当前中断。glibc 包装函数做了一些工作(即检查新的中断是否小于 addr)以提供上述 0 和 -1 返回值。

因此,在汇编中,您可以使用 0 或 -1 之类的荒谬值来调用它来获取当前值。

请注意,您无法“释放”通过 brk 分配的内存 - 您可能只想链接到用 C 编写的 malloc 函数。从程序集中调用 C 函数并不难。

  • “请注意,您无法“释放”通过 brk 分配的内存”。但是“man brk”说“增加程序中断会为进程分配内存;减少中断会释放内存。” 那么为什么不能“释放”通过 brk 分配的内存呢? (2认同)