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

我知道在类Unix系统中,像glibc这样的图书馆可以作为内核和用户之间的媒介。 所以例如在实现malloc() ,glibc如何调用Linux内核的系统调用吗?


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

int $0x80

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

有关Linux x86系统调用的更多信息,可以阅读本文档。

编辑:正如Jester在评论中提到的,Intel x86处理器(Pentium IV之后)现在支持没有int开销的systenter / sysexit指令,并且在这些处理器上这些指令被Linux用于系统调用。


在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中找到的编号。 在上面的例子中,exit syscall的数字是1.然后你设置syscall所需的参数。 之后,您可以调用软件中断int 0x80。

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

链接地址: http://www.djcxy.com/p/90879.html

上一篇: How does a C library call kernel system calls

下一篇: Custom linux kernel syscall wrapper function