C库如何调用内核系统调用
我知道在类Unix系统中,像glibc这样的图书馆可以作为内核和用户之间的媒介。 所以例如在实现malloc()
,glibc如何调用Linux内核的系统调用吗?
在Linux x86中,系统调用(系统调用)通过调用中断0x80
。 在组装中,它完成了:
int $0x80
系统调用的选择是通过将信息传递给CPU寄存器来完成的。 malloc
本身不是一个系统调用,但malloc
算法通常使用sbrk
或mmap
系统调用( 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