我知道在类Unix系统中,像glibc这样的库可以作为内核和用户空间之间的中介。因此,例如在实现malloc()
时,glibc如何调用linux内核的系统调用,它是否使用汇编?
答案 0 :(得分:3)
在Linux x86中,通过调用中断0x80
进行系统调用(系统调用)。在装配中,它完成:
int $0x80
通过将信息传递给CPU寄存器来完成系统调用的选择。 malloc
本身不是系统调用,但malloc
算法通常使用sbrk
或mmap
系统调用(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。