歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> kernel學習:系統調用的知識點

kernel學習:系統調用的知識點

日期:2017/3/3 14:55:10   编辑:Unix基礎知識

一般情況下,用戶進程是不能訪問內核空間的。它既不能訪問內核中的數據,也不能訪問內核中的函數。但在linux內核中設置了一組用於實現各種系統功能的函數,成為系統調用。用戶可以在應用程序中調用它們。

linux系統還提供了一些c庫,這些庫對系統調用進行了一些包裝和擴展。

系統調用,POSIX,C庫,系統命令和內核函數

1、系統調用和POSIX

雖然系統調用是內核和用戶空間的橋梁,但是用戶的應用程序在訪問內核時是通過系統提供的應用編程接口API來實現的。

操作系統的API主要作用是把操作系統的功能全展現出來,提供給應用程序。

在UNIX中最通用的操作系統API是基於POSIX(Portable Operating System ofUNIX)標准的。後來從UNIX發展來的版本各種各樣,以至於給應用程序移植帶來了很大的不便。為了結束這個局面IEEE制定了POSIX標准,提高UNIX環境下的用戶程序移植性。POSIX標准不局限於UNIX,很多其他的操作系統也支持該標准如DEC OpenVMS和WindowNT。linux系統兼容POSIX標准,提供了根據POSIX而定義的API函數。這些函數和系統調用有著直接 的關系。一個API函數可以用一個系統調用實現,也可以多個系統調用來實現。同時不用系統調用來實現。

2、系統調用和c庫

操作系統的API通常又有C庫的方式來提供,linux也是如此。c庫提供了兼容POSIX的絕大數API。內核提供的每個系統調用在c庫中都有相應的函數封裝。而且系統調用名和c庫中封裝的函數名往往相同。如read

c庫中封裝的函數在調用系統調用之前,一般只做一點工作。如系統調用truncate和truncate64在庫中封裝的truncate決定到底調用哪個系統調用。

封裝的函數和系統調用不是一一對應關系。有的封裝函數甚至不調用任何的系統調用如strcpy和atoi

3、系統調用和系統命令

系統命令是c庫的更上層。是利用c庫實現的應用程序。如ls命令。

strace可以跟蹤系統調用。

4、系統調用和內核函數

可以認為系統調用時內核函數的一部分。

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

5、系統調用表:

系統調用表sys_call_table存儲了所有系統調用對應的服務例程函數的地址。

在x86中:2.6.38/arch/x86/kernel/syscall_table_32.S

在arm中2.6.38/arch/arm/kernel/calls.S

6、系統調用號:每個系統調用對應一個唯一的系統調用號。用戶通過系統調用號,而不是名稱來調用。

x86:2.6.38/arch/x86/include/asm/unistd32.h或unistd64.h

arm:2.6.38/arch/arm/include/asm/unistd.h能找到它們。

內核是通過系統調用號作為下表去sys_call_table來獲取服務例程的地址的。在系統中系統調用號一旦分配就不能去除,這是為了兼容。

7、系統調用例程

所有的系統調用服務例程都聲明在include/linux/syscalls.h中,但分散在不同的文件中。

asmlinkagelong sys_nice(int increment);

系統調用除了sys_外還有一個asmlinkage來告訴編譯器從堆棧中獲取參數。還必須有一個long的返回,表示執行成功還是出錯。系統調用號,名稱和目的都是相同的,但是在不同內核和架構中實現的方法可能不同。

8、如何使用系統調用

1、通過c庫來使用系統調用

2、在2.6.18之前的內核使用_syscall宏來使用系統調用。

3、在2.6.19開始廢除了_syscall,而使用syscall()通過向函數提供調用號和參數實現調用

出處:http://blog.csdn.net/muge0913/article/details/7517303

Copyright © Linux教程網 All Rights Reserved