3

重複の可能性:
glibcソースのヘルプが必要

Linuxカーネルで独自のシステムコールを実装する方法を理解しています。私たちはこれをACプログラムでsyscall()またはで呼び出すことができることを知っています。_asm()

  1. しかし、この新しいシステムコール用にglibcapiを作成する方法を理解したいのですが。

  2. open()and 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、「call write」では、writeはここでglibcの呼び出しだと思いますか?その後どうなりますか?glibc呼び出しをシステムコールにどのようにマッピングしますか?

4

1 に答える 1

2

たとえば、この回答と同様の質問に対するその回答を参照してください。syscallsLinux カーネル、 Linux syscallsの概要、およびアセンブリのハウツーについてもお読みください。

writeglibcの関数は、真のシステムコールではありません。これはラッパーです (たとえばsysenter、マシン命令、おそらく VDSO を使用してsycallを実行し、 を設定しますerrno)。strace一部のプログラムによって実行されるシステム コールを理解するために使用できます。

たとえば、MUSL libcには、このwrite.c実装がありwriteます。GNU libc については、そのwrite.cを見てください。

于 2012-09-24T10:35:14.757 に答える