首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为汇编中的syscall的Linux sbrk()

作为汇编中的syscall的Linux sbrk()
EN

Stack Overflow用户
提问于 2012-04-26 02:58:03
回答 2查看 3.7K关注 0票数 5

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-26 03:09:55

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

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

编辑:在linux上:

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

因此,在汇编中,您可以使用像0或-1这样的荒诞值来调用它,以获得当前值。

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-26 03:13:39

来源:

代码语言:javascript
复制
#include <unistd.h>
#define SOME_NUMBER  8
int main() {
  void *ptr = sbrk(8);
  return 0;
}

使用with Assembly Output选项编译

代码语言:javascript
复制
gcc -S -o test.S test.c

然后看看ASM代码

代码语言:javascript
复制
_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:

没有对它的系统调用,但您应该仍然能够进行调用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10322061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档