написание API glibc для системного вызова

Возможный дубликат:
Нужна помощь с исходным кодом glibc

Я понимаю, как реализовать наши собственные системные вызовы в ядре Linux. Я знаю, что мы можем вызвать это с помощью syscall() или _asm() в программе на языке C.

  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, В "позвонить и написать" я думаю, что здесь есть вызов glibc ?. что происходит после этого? как он сопоставляет вызов glibc с системным вызовом?


person user1694118    schedule 24.09.2012    source источник
comment
Вы пытались изучить исходный код glibc? Есть много примеров.   -  person Maxim Egorushkin    schedule 24.09.2012
comment
См. также: stackoverflow.com/ вопросы/11548779/   -  person ninjalj    schedule 29.09.2012


Ответы (1)


См., например. этот ответ и этот ответ на подобные вопросы. Узнайте также больше о системных вызовах, ядро Linux, обзор системные вызовы Linux и сборка как

Функция write из glibc не является настоящим системным вызовом. Это оболочка (выполняет системный вызов, например, через sysenter машинную инструкцию, возможно, с помощью VDSO, и настройка errno). Вы можете использовать strace для понимания системных вызовов, выполняемых какой-либо программой.

Например, MUSL libc содержит write.c реализация для write. Для GNU libc посмотрите его написать.c.

person Basile Starynkevitch    schedule 24.09.2012
comment
Василий, спасибо за быстрый ответ. Я понимаю, как это работает в ядре. Я не мог получить сопоставление glibc с системным вызовом, где он генерирует прерывание. см. в вашем примере в MUSL libc в write.c я вижу return syscall_cp (SYS_write, fd, buf, count); . Думаю, это похоже на syscall() в glibc. Но я не нахожу в определении glibc write(), где он отправляет int $0x80. Еще раз спасибо - person user1694118; 24.09.2012
comment
Я предполагаю, что glibc не делает напрямую int 80, он использует VDSO, как упоминалось в моем ответе. - person Basile Starynkevitch; 24.09.2012
comment
Я думаю, что код glibc не является правильной реализацией write(); вместо этого это заглушка, которая вставляется, когда write() недоступен. Но я также не смог найти правильную реализацию :-/ См. этот вопрос: stackoverflow.com/questions/6515583/need-help-with-glibc-source - person Aaron Digulla; 24.09.2012