庫函數是語言本身的一部分,而系統函數是內核提供給應用程序的接口,屬於系統的一部分。
函數庫調用是語言或應用程序的一部分,而系統調用是操作系統的一部分。
用戶應用程序訪問並使用內核所提供的各種服務的途徑即是系統調用。在內核和用戶應用程序相交界的地方,內核提供了一組系統調用接口,通過這組接口,應用程序可以訪問系統硬件和各種操作系統資源。
1.系統調用是為了方便應用使用操作系統的接口,而庫函數是為了方便人們編寫應用程序而引出的,比如你自己編寫一個函數其實也可以說就是一個庫函數。
2.系統調用可以理解為內核提供給我們在用戶態用的接口函數,可以認為是某種內核的庫函數。
3.read就是系統調用,而fread就是C標准庫函數.
※函數庫調用 VS 系統調用
函數庫調用 |
系統調用 |
在所有的ANSI C編譯器版本中,C庫函數是相同的 |
各個操作系統的系統調用是不同的 |
它調用函數庫中的一段程序(或函數) |
它調用系統內核的服務 |
與用戶程序相聯系 |
是操作系統的一個入口點 |
在用戶地址空間執行 |
在內核地址空間執行 |
它的運行時間屬於“用戶時間” |
它的運行時間屬於“系統”時間 |
屬於過程調用,調用開銷較小 |
需要在用戶空間和內核上下文環境間切換,開銷較大 |
在C函數庫libc中有大約300個函數 |
在UNIX中大約有90個系統調用 |
典型的C函數庫調用:system fprintf malloc |
典型的系統調用:chdir fork write brk; |
庫函數調用通常比行內展開的代碼慢,因為它需要付出函數調用的開銷。但系統調用比庫函數調用還要慢很多,因為它需要把上下文環境切換到內核模式。
系統調用和函數庫的關系。
系統調用通過軟中斷int 0x80從用戶態進入內核態。
函數庫中的某些函數調用了系統調用。
函數庫中的函數可以沒有調用系統調用,也可以調用多個系統調用。
編程人員可以通過函數庫調用系統調用。
高級編程也可以直接采用int 0x80進入系統調用,而不必通過函數庫作為中介。
如果是在核心編程,也可以通過int 0x80進入系統調用,此時不能使用函數庫。因為函數庫中的函數是內核訪問不到的。
2. 從用戶調用庫函數到系統調用執行的流程。
1) 假設用戶調用ssize_t write (int fields, cont void *buff, size_t nbytes);庫函數。
2) 庫函數會執行int 0x80中斷。因為中斷使得進程從用戶態進入內核態,所以參數通過寄存器傳送。
3) 0x80中斷對應的中斷例程被稱為system call handler。其工作是:
i. 存儲大多數寄存器到內核堆棧中。這是匯編代碼寫的。
ii. 執行真正的系統調用函數――system call service routine。這是C代碼。
iii. 通過ret_from_sys_call ()返回,回到用戶態的庫函數。這是匯編代碼。
