我理解如何在linux内核中实现我们自己的系统调用。我知道我们可以在c程序中使用syscall()
或_asm()
来调用它。
但我想了解如何为这个新系统调用编写glibc api?
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,在“call write”中我觉得写在这里是glibc调用吗?之后发生了什么?它如何将glibc调用映射到系统调用?
答案 0 :(得分:2)
参见例如this answer和that answer类似的问题。另请阅读有关syscalls,linux kernel,linux syscalls概述和assembly howto
的详情 glibc的write
函数不是真正的系统调用。它是一个包装器(通过例如sysenter
机器指令执行sycall,可能使用VDSO,并设置errno
)。
您可以使用strace
来了解某些程序完成的系统调用。