【问题标题】:writing a glibc api for a system call [duplicate]为系统调用编写 glibc api [重复]
【发布时间】:2012-09-15 19:12:05
【问题描述】:

可能重复:
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 );
    }
    

当我将上述程序转换为程序集时,它给出了

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,在“调用写入”中,我认为 write 是 glibc 调用?之后会发生什么?它如何将 glibc 调用映射到系统调用?

【问题讨论】:

标签: c linux unix glibc system-calls


【解决方案1】:

参见例如this answerthat answer 类似的问题。阅读更多关于syscallslinux kernellinux syscallsassembly howto 的概述

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

例如,MUSL libcwrite 具有此write.c 实现。对于 GNU libc,请查看其 write.c

【讨论】:

  • Basile,感谢您的快速回复。我了解它在内核中的工作方式。我无法将 glibc 映射到生成中断的系统调用。请参阅您在 MUSL libc 中 write.c 的示例,我看到“return syscall_cp(SYS_write, fd, buf, count);” .我猜这类似于 glibc 中的 syscall() 。但是,我没有在 glibc write() 定义中找到它发送 int $0x80 的位置。再次感谢
  • 我猜 glibc 并没有直接做 int 80 它正在使用 VDSO,正如我的回答中提到的那样。
  • 我认为 glibc 代码不是 write() 的正确实现;相反,它是当write() 不可用时插入的存根。但我也找不到正确的实现:-/ 见这个问题:stackoverflow.com/questions/6515583/need-help-with-glibc-source
猜你喜欢
  • 2011-12-10
  • 2010-12-15
  • 1970-01-01
  • 2015-03-14
  • 2016-01-18
  • 2013-07-19
  • 1970-01-01
  • 2015-02-05
  • 2023-03-11
相关资源
最近更新 更多