Jon*_*don 5 linux assembly system-calls sbrk
因此,作为一项挑战,为了提高性能,我正在用汇编语言编写一个简单的服务器。我知道的唯一方法是通过系统调用。(通过 int 0x80)显然,我将需要比在汇编或加载时分配的内存更多的内存,所以我阅读并决定我想使用 sbrk(),主要是因为我不理解 mmap() :p
无论如何,Linux不为sbrk()提供中断,只为brk()提供中断。
那么...如何找到当前程序中断以使用brk()?我考虑过使用 getrlimit(),但我不知道如何获取资源(我猜的进程 ID)来传递给 getrlimit()。或者我应该找到其他方法来实现 sbrk() ?
sbrk函数可以通过获取当前值并手动减去所需的量来实现。有些系统允许您使用 获取当前值brk(0),其他系统则在变量中跟踪它[该变量使用 的地址初始化_end,该地址由链接器设置为指向初始中断值]。
这是一个非常特定于平台的事情,所以 YMMV。
编辑:在Linux上:
然而,实际的 Linux 系统调用成功时会返回新的程序中断。失败时,系统调用返回当前中断。glibc 包装函数做了一些工作(即检查新的中断是否小于 addr)以提供上述 0 和 -1 返回值。
因此,在汇编中,您可以使用 0 或 -1 之类的荒谬值来调用它来获取当前值。
请注意,您无法“释放”通过 brk 分配的内存 - 您可能只想链接到用 C 编写的 malloc 函数。从程序集中调用 C 函数并不难。