2014-12-29 7 views
0

Где код для this _write() used in stdio?Где определена _write libc libc libc?

wiki page говорит, что каждый системный вызов должен быть зарегистрирован в мастер-файле и в Symbol.map LibC, он также говорит, что для каждой записи в Symbol.map трех символов генерируются: symbol, _symbol и sys_symbol.

я нашел где sysent для write syscall, то _write symbol в Symbol.map, но я не могу найти фактический код для _write.

+0

Если кто также заинтересован в Linux SYSCALL в, LWN имеет некоторые большие сообщения об этом https://lwn.net/Articles/ 604287/ –

ответ

0

Имейте в виду, что _write - это/очень/сложный системный вызов. Поскольку он функционирует на дескрипторе файла, который может быть файлом на любом типе файловой системы или даже в сетевом сокете, он в основном отбрасывает места по всему ядру.

Страница вики-страницы, на которую вы ссылаетесь, является правильным местом, чтобы начать понимать системные вызовы FreeBSD. пишите, вероятно, не самый лучший syscall, чтобы использовать их для понимания, если это то, что вы пытаетесь сделать.

Реализация системного вызова записи (от FreeBSD 10.0-RELEASE):

/usr/src/sys/kern/sys_generic.c:358 

#ifndef _SYS_SYSPROTO_H_ 
struct write_args { 
    int fd; 
    const void *buf; 
    size_t nbyte; 
}; 
#endif 
int 
sys_write(td, uap) 
    struct thread *td; 
    struct write_args *uap; 
{ 
    struct uio auio; 
    struct iovec aiov; 
    int error; 

    if (uap->nbyte > IOSIZE_MAX) 
     return (EINVAL); 
    aiov.iov_base = (void *)(uintptr_t)uap->buf; 
    aiov.iov_len = uap->nbyte; 
    auio.uio_iov = &aiov; 
    auio.uio_iovcnt = 1; 
    auio.uio_resid = uap->nbyte; 
    auio.uio_segflg = UIO_USERSPACE; 
    error = kern_writev(td, uap->fd, &auio); 
    return(error); 
} 
+0

Кстати, в то время как в syscalls иногда есть обертки в libc, необработанный syscall не находится внутри libc, он находится в самом ядре. –

+0

Ваша догадка правильная, я пытаюсь понять, как работает системный вызов. Я просто выбрал 'puts' наугад, потому что я догадывался, что IO нуждается в системном вызове. Я понимаю, что на x86 в конце концов он будет использовать 'int $ 0x80', как определено в' libc/i386/SYS.h', в момент системного вызова все аргументы будут в стеке с 'SYS_write' в регистре , но я не могу найти, где фактически выполняется системный вызов, я имею в виду, где код, который использует прерывание? Кроме того, я думаю, что системный вызов в конечном итоге закончится в 'i386/i386/trap.c', верно? –

+0

На моем телефоне, поэтому я не могу смотреть на src, но это звучит правильно. Сценарий getpid(), как правило, лучше всего отслеживает ядро. Он входит в ядро, захватывает одно значение и передает его обратно в пользовательское пространство. I/O является уродливым, и я стараюсь избегать его, когда могу –

 Смежные вопросы

  • Нет связанных вопросов^_^