系統呼叫的概念與中斷非常相似,這是因為軟體中斷是執行系統呼叫最常見的方式。我們將討論系統呼叫概念的各個方面。例如,使用者空間發起系統呼叫的細節,核心中一組系統呼叫處理器的執行過程,vdso
和vsyscall
概念以及其他資訊。
在了解 linux 核心系統呼叫執行過程之前,了解一些系統呼叫的原理是有幫助的。我們從下面的段落開始。
系統呼叫是使用者空間請求核心服務。作業系統核心提供很多服務。當程式讀寫檔案,開始監聽連線的socket, 刪除或建立目錄或程式結束時,都會執行系統呼叫。換句話說,系統呼叫僅僅是一些核心空間函式,使用者空間程式呼叫其處理一些請求。
linux 核心提供一系列的函式並且這些函式與cpu架構相關。 例如:x86_64 提供 322 個系統呼叫,x86 提供 358 個不同的系統呼叫。 系統呼叫僅僅是一些函式。 我們討論乙個使用組合語言編寫的簡單 hello world 示例:
編譯一下:
這些簡單的**是乙個簡單的linuxx86_64
架構hello world
匯程式設計序,**包含兩個段:
首先使用命令strace
追蹤下可執行程式hello
的系統呼叫:
由上圖可以看出.text
段中第一部分呼叫了write
系統呼叫,第二部分呼叫了exit
系統呼叫。
對應函式的前六個引數。若函式多於六個引數,其他引數將放在堆疊中。
示例**中未直接使用系統呼叫,但程式通過系統呼叫列印輸出,檢查檔案的許可權或是從檔案中讀寫。
現在分析下:
首先在示例程式及一般應用中syscall
指令有什麼功能?
syscall 引起作業系統系統呼叫處理器處於特權級0,通過加 載ia32_lstar msr至rip完成(在rcx中儲存 syscall 之後指令位址之後)。 (wrmsr 指令確保ia32_lstar使用msr總是包含乙個連續的位址。)
… … …
syscall 將 ia32_star msr 的 47:32 位載入至 cs 和ss 段選擇器。 因此,根據這些段選擇器 cs 和 ss ,描述符快取並未從描述符載入(位於 gdt 或 ldt 中)。相反,描述符快取從固定值載入。 作業系統軟體需要確保,由段選擇器得到的描述符與從固定值載入至描述符快取的描述符保持一致。
syscall 指令不保證兩者的一致。
arch/x86/entry/entry_64.s
匯程式設計序中定義的entry_syscall_64
初始化syscalls
同時syscall
指令進入arch/x86/kernel/cpu/common.c
原始碼檔案中的ia32_star model specific register
:
wrmsrl(msr_lstar, entry_syscall_64);
因此,syscall
指令喚醒乙個系統呼叫對應的處理程式。但是如何確定呼叫哪個處理程式?事實上這些資訊從通用目的暫存器得到。正如系統呼叫表中描述,每個系統呼叫對應特定的編號。上面的示例中, 第乙個系統呼叫是 -write
將資料寫入指定檔案。在系統呼叫表中查詢 write 系統呼叫.write 系統呼叫的編號為 -1
。在示例中通過rax
暫存器傳遞該編號,接下來的幾個通用目的暫存器:%rdi
,%rsi
和%rdx
儲存write
系統呼叫的引數。 在示例中為檔案描述符 (1
是stdout), 第二個引數字串指標, 第三個為資料的大小。是的,你聽到的沒錯,系統呼叫的引數。正如上文, 系統呼叫僅僅是核心空間的c
函式。示例中第乙個系統呼叫為 write ,在 [fs/read_write.c] ( 原始檔中定義如下:
syscall_define3(write, unsigned int, fd, const char __user *, buf,
size_t, count)
或者換言之:
ssize_t write(int fd, const void *buf, size_t nbytes);
示例的第二部分也是一樣的, 但呼叫了另一系統呼叫exit。這個系統呼叫僅需乙個引數: 第一節 Linux系統簡介
一.linux定義 linux 是乙個作業系統,就像你多少已經了解的 windows xp,7,8 和 max os.作業系統在整個計算機系統中的角色 linux 是系統呼叫和核心那兩層,直觀的來看,我們使用的作業系統還包含一些在其上執行的應用程式,比如文字編輯器,瀏覽器,電子郵件.二.linux歷...
如何呼叫 Windows API 第一節
dllimport kernel32.dll entrypoint getdiskfreespace public static extern int getdiskfreespace string lprootpathname,ref int lpsectorspercluster,ref int...
第一節 系統IO函式
1,open include include include int open const char pathname,int flags int open const char pathname,int flags,mode t mode pathname 開啟的檔名 flags 操作標誌位 o ...