为系统调用编写glibc api

时间:2012-09-24 10:25:49

标签: c linux unix glibc system-calls

  

可能重复:
  Need help with glibc source

我理解如何在linux内核中实现我们自己的系统调用。我知道我们可以在c程序中使用syscall()_asm()来调用它。

  1. 但我想了解如何为这个新系统调用编写glibc api?

  2. open()read() glibc函数如何调用内核中的系统调用?

    char      message[ ] = "Hello!\n";
    
    int main( void )
    {
            write( 1, message, 7 );
            exit( 0 );
    }
    
  3. 当我将上述程序转换为程序集时,它正在给出

    main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $20, %esp
        movl    $7, 8(%esp)
        movl    $message, 4(%esp)
        movl    $1, (%esp)
        call    write
        movl    $0, (%esp)
        call    exit
        .size   main, .-main
        .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
        .section        .note.GNU-stack,"",@progbits
    

    3,在“call write”中我觉得写在这里是glibc调用吗?之后发生了什么?它如何将glibc调用映射到系统调用?

1 个答案:

答案 0 :(得分:2)

参见例如this answerthat answer类似的问题。另请阅读有关syscallslinux kernellinux syscalls概述和assembly howto

的详情

glibc的write函数不是真正的系统调用。它是一个包装器(通过例如sysenter机器指令执行sycall,可能使用VDSO,并设置errno)。 您可以使用strace来了解某些程序完成的系统调用。

例如,MUSL libc针对write实施write.c。对于GNU libc,请查看其write.c