2013-09-24 52 views
6

SYS_exit,sys_exit()和exit()之間的區別是什麼?系統調用:sys_exit(),SYS_exit和exit()之間的區別

我明白了什麼:

  • Linux內核提供的系統調用,這是在man 2 syscalls上市。
  • glibc提供的那些系統調用的封裝函數與系統調用的名稱大多相似。

我的問題:在man 2 syscalls,沒有提及SYS_exit和sys_exit(),例如。他們是什麼?

注意:系統調用exit這裏只是一個例子。我的問題確實是:什麼是SYS_xxx和sys_xxx()?

回答

3

我會用你的例子中的exit(),儘管這適用於所有的系統調用。

sys_exit()形式的函數是內核例程的實際入口點,它實現了您認爲是exit()的函數。這些符號甚至對用戶模式程序員都不可用。也就是說,除非你正在竊取內核,否則你不能鏈接到這些函數,因爲它們的符號在內核之外是不可用的。如果我寫libmsw.a其中有像

static int msw_func() {} 
它定義

一個文件範圍的功能,你就沒有成功的嘗試,因爲它不是在libmsw符號表中導出鏈接到它;那就是:

cc your_program.c libmsw.a 

會產生這樣的錯誤:

ld: cannot resolve symbol msw_func 

,因爲它不會導出;內核中包含的sys_exit()同樣適用。

爲了讓用戶程序進入內核例程,需要使用syscall(2)接口來實現從用戶模式切換到內核模式。當那個模式開關(有時稱爲陷阱)發生時,使用一個小整數來查找將整數映射到內核函數的內核表中適當的內核例程。在表中的條目的形式

{SYS_exit, sys_exit}, 

凡SYS_exit是一個預處理宏是

#define SYS_exit (1) 

既然在你出生前,因爲還沒有理由去改變它一直是1。它也恰好是系統調用表中的第一個條目,它使查找一個簡單的數組索引。

正如你在你的問題中注意到的,常規用戶模式程序訪問sys_exit的正確方法是通過glibc(或類似的核心庫)中的薄包裝器。如果您正在編寫內核代碼,那麼您需要混淆SYS_exit或sys_exit的唯一原因。

+0

glibc不會爲每個系統調用提供包裝,所以在某些情況下,您可能需要相應的'SYS_'預處理宏來通過用戶空間代碼中的'syscall()'直接調用系統調用。這些案例很少見。 – 2013-09-24 10:33:24

相關問題