[英]How does a C library call kernel system calls
我知道在類似Unix的系統中,諸如glibc之類的c庫充當內核和用戶域之間的中介。 因此,例如,在實現malloc()
,glibc如何調用Linux內核的系統調用,是否使用匯編語言?
在Linux x86中,系統調用(系統調用)是通過調用中斷0x80
。 在組裝中,它是通過以下方式完成的:
int $0x80
syscall的選擇是通過將信息傳遞到CPU寄存器來完成的。 malloc
本身不是syscall,但是malloc
算法通常使用sbrk
或mmap
syscall( sbrk
brk
syscall)。
有關Linux x86系統調用的更多信息,您可以閱讀本文檔 。
編輯:正如Jester在評論中提到的那樣,Intel x86處理器(在Pentium IV之后)現在支持沒有int
開銷的systenter
/ sysexit
指令,並且在這些處理器上,Linux將這些指令用於系統調用。
在0x86體系結構上調用exit(0)syscall的示例。
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中找到。 在以上示例中,出口syscall的編號為1。然后,設置syscall所需的參數。 之后,您調用軟件中斷int 0x80。
因此,對於malloc,它將在內部調用brk或mmap,然后將設置所需的參數,然后將調用int0x80。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.