因此,为了提高性能,我用汇编语言编写了一个简单的服务器。据我所知,唯一的方法是通过系统调用。(通过int 0x80)显然,我将需要比在汇编或加载时分配的内存更多的内存,所以我仔细阅读并决定使用sbrk(),主要是因为我不理解mmap() :p
无论如何,Linux不为sbrk()提供中断,只为brk()提供中断。
所以..。如何找到要使用brk()的当前程序中断?我考虑过使用getrlimit(),但我不知道如何将资源(我猜是进程id )传递给getrlimit()。或者我应该找一些其他的方法来实现sbrk()?
发布于 2012-04-26 03:09:55
sbrk函数可以通过手动获取当前值并减去所需金额来实现。一些系统允许您使用brk(0)获取当前值,另一些系统在一个变量中跟踪当前值,该变量使用_end的地址进行初始化,该地址由链接器设置为指向初始中断值。
这是一个非常特定于平台的东西,所以YMMV。
编辑:在linux上:
然而,实际的Linux系统调用在成功时返回新的程序中断。失败时,系统调用返回当前中断。glibc包装器函数执行一些工作(即,检查新的中断是否小于addr),以提供上述的0和-1返回值。
因此,在汇编中,您可以使用像0或-1这样的荒诞值来调用它,以获得当前值。
请注意,您不能“释放”通过brk分配的内存--您可能只想链接一个用C编写的malloc函数。从汇编中调用C函数并不难。
发布于 2012-04-26 03:13:39
来源:
#include <unistd.h>
#define SOME_NUMBER 8
int main() {
void *ptr = sbrk(8);
return 0;
}使用with Assembly Output选项编译
gcc -S -o test.S test.c然后看看ASM代码
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
movl $8, %eax
movl %eax, %edi
callq _sbrk
movq %rax, -16(%rbp)
movl $0, -8(%rbp)
movl -8(%rbp), %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
addq $16, %rsp
popq %rbp
ret
Leh_func_end1:没有对它的系统调用,但您应该仍然能够进行调用
https://stackoverflow.com/questions/10322061
复制相似问题