C库如何调用内核系统调用

时间:2015-10-08 22:08:17

标签: c assembly linux-kernel operating-system kernel

我知道在类Unix系统中,像glibc这样的库可以作为内核和用户空间之间的中介。因此,例如在实现malloc()时,glibc如何调用linux内核的系统调用,它是否使用汇编?

2 个答案:

答案 0 :(得分:3)

在Linux x86中,通过调用中断0x80进行系统调用(系统调用)。在装配中,它完成:

int $0x80

通过将信息传递给CPU寄存器来完成系统调用的选择。 malloc本身不是系统调用,但malloc算法通常使用sbrkmmap系统调用(brk系统调用sbrk)。

有关Linux x86系统调用的更多信息,请阅读此document

编辑:正如Jester在评论中提到的那样,英特尔x86处理器(在Pentium IV之后)现在支持systenter / sysexit指令不具备int开销,在这些处理器上,这些指令由Linux用于系统调用。

答案 1 :(得分:1)

在0x86架构上调用exit(0)系统调用的示例。

movl $1, %eax   #$1=number of exit syscall. 
movl $0, %ebx   #$0=First argument of exit syscall
int 0x80        #call the software interrupt

每个系统调用都有一个可以在/usr/include/asm/unistd.h中找到的编号。在上面的示例中,退出系统调用的编号为1。 然后设置系统调用所需的参数。之后,你调用软件中断int 0x80。

因此对于malloc,它将在内部调用brk或mmap,然后它将设置所需的参数,然后调用int0x80。