1. 程式人生 > >窺探 kernel --- 有關係統呼叫的幾個知識點

窺探 kernel --- 有關係統呼叫的幾個知識點



郵箱:[email protected]

一般情況下,使用者程序是不能訪問核心空間的。它既不能訪問核心中的資料,也不能訪問核心中的函式。但在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、系統呼叫和核心函式

可以認為系統呼叫時核心函式的一部分。

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()通過向函式提供呼叫號和引數實現呼叫

相關推薦

窺探 kernel --- 關係呼叫知識點

 郵箱:[email protected] 一般情況下,使用者程序是不能訪問核心空間的。它既不能訪問核心中的資料,也不能訪問核心中的函式。但在linux核心中設定了一組用於實現各種系統功能的函式,成為系統呼叫。使用者可以在應用程式中呼叫它們。 linux

Java並發編程多難?這核心技術你掌握了嗎?

周期 回收 dex 而後 語言 交互 例子 implement 資源 本文主要內容索引 1、Java線程 2、線程模型 3、Java線程池 4、Future(各種Future) 5、Fork/Join框架 6、volatile 7、CAS(原子操作) 8、AQS(並發同步框

關係UISearchBar在ios11plus上出現游標的問題

我在最近專案裡做搜尋的時候,首先嚐試用到的是UISearchBar來實現,當用戶點選進入到搜尋頁面的時候,進入編輯狀態,在viewWillAppear裡面寫入 [self.searchBar becomeFirstResponder],但是在ios11plus的機型上,游標只出現的一半,而且

epoll的相關係呼叫及詳解

轉載自:https://blog.csdn.net/xiajun07061225/article/details/9250579 epoll的相關係統呼叫 epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統呼叫。 int epoll

C# 關係音量的操作

需要知道的 調音量是可以快捷鍵的,還可以用Winmm.dll,但是這個過於複雜了,還有左右聲道,我們不需要這麼複雜。還有個辦法 https://stackoverflow.com/questions/14306048/controlling-volume-mixer 程式碼 public sta

epoll的相關係呼叫

epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統呼叫。 int epoll_create(int size); 建立一個epoll的控制代碼。自從linux2.6.8之後,size引數是被忽略的。需要注意的是,當建立

kernel/uboot關於defconfig的問題?

一,defconfig與.config是什麼關係? .config不是defconfig的拷貝,defconfig僅僅儲存與預設配置不同的選項。配置階段綜合KCONFIG檔案與defconfig,有衝突時以defconfig為準。 二,defconfig中的#CONFIG_XXX is not set有具

向圖的演算法分析總結

簡介     前面討論的很多文章裡,都是針對無向圖進行的分析。無向圖的一個特性就是其中一旦兩個節點a和b是相連的,這就意味著有路徑從a到b,同時也有從b到a的。它具體對應的矩陣表達方式對應著一個對稱矩陣。而這裡重點是考察有向圖。和無向圖比起來,有向圖更加多了一種出入度的

檔案屬性及目錄相關係呼叫

stat()/fstat()/lstat()系統呼叫 功能 獲取檔案狀態 標頭檔案 #include <sys/types.h> #include <sys/stat.h> #

Linux學習記錄--程序控制相關係呼叫

系統呼叫:程序控制 fork系統呼叫 函式作用:建立一個子程序 形式:pid_tfork(void);              pid_t vfork(void); 說明:    使用vfork創子程序時,不會程序父程序的上下文 返回值:[返回值=-1]子程序建立失敗

共享記憶體相關係呼叫

程序間通訊的一種方式就是使用共享記憶體,Linux下與共享記憶體相關的系統呼叫是程式設計的基礎,根據專案中的使用情況,羅列如下。 key_t ftok(constchar * pathname, int id) 系統建立IPC通訊(訊息佇列、訊號量、共享記憶體)時必須指定一

【Linux】檔案相關係呼叫介面(IO)

早期在寫C語言介面的時候,我們可以通過fopen來開啟一個檔案,下面這段兩段程式碼為例: hello.c寫檔案 1 #include <stdio.h> 2

多程序相關係呼叫

1、fork函式#include<sys/types.h> #include<unistd.h> pid_t fork(void);函式每次呼叫都返回兩次,在父程序中返回子程序ID,在子程序中返回0。呼叫失敗是返回-1,並置errno。fork函式複製

學些 Python 中的知識點

之前只是簡單會用,現在重新按照官網的 Tutorial 來學 python 中一切變數都是引用(指標) 最簡單的例子: def func(ll): ll.append(42) ll = [1, 2] func(ll) print(str(ll)) #輸出 [1, 2, 42] 雖然函式傳參

mongodb、mysql資料庫的知識點

1、MongoDB與關係型資料庫的區別: MongoDB是一個面向文件的資料庫,資料結構為鍵值對組成,文件類似於JSON物件,欄位值可以包含陣列、其他文件。 MongoDB資料庫沒有預定模式,文件的鍵(key)值(value)不是固定的型別與大小,而關係型資料庫中每個表的欄位都

transform的知識點

transform 的幾個知識點 三維座標系 1、w3c中給出了三維空間的座標系,z軸指向螢幕外 2、 CSS3 transform 變換使用的是元素自身座標系 位移 **translateZ(): 需要給父標籤新增透視才能觀察到 透視 透視是通過對元素中靠

javascript中還有知識點沒弄懂!現在沒時間弄懂,到時候回過頭來再理解這知識點,先記錄一下

javascript中還有幾個知識點沒弄懂!現在沒時間弄懂,到時候回過頭來再理解這幾個知識點,先記錄一下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>

學習大資料掌握這知識點,會少走很多彎路

說到初識Hadoop,這章我們一起來聊聊,更高效的WordCount。     在聊之前我多說兩句,大家既然想學習大資料,那麼就請你放棄你自己認為的自學,或者是看幾本書就能學會的念頭,好好的一步一步的系統的去學習才是王道,畢竟學完之後我們是用來創造價值的,所以一

Sitecore 9 使用 Azure Search的知識點

Sitecore 的patch config檔案(通常在app config的Include資料夾中) 使用role:require和search:require,不需要disabled檔案字尾名了 寫Index的時候,Azure Search要求Field Name必須存在於Schema中( Error

C#基礎學習需要注意的知識點

在學習Unity之前,相信我們都要經歷C#程式語言的學習,大家都知道在C#是一門面向物件的程式語言,具有封裝繼承多型的一些特點,這些知識點淺學並不難,但是當我們在Unity的道路上越走越遠的時候,我