作業四 系統呼叫的工作機制

2022-08-21 23:33:16 字數 1832 閱讀 3338

系統呼叫列表參見
一、前情提要

系統呼叫

作業系統為使用者態程序與硬體裝置進行互動提供了一組介面

api應用程式設計介面,是乙個函式定義。

系統呼叫通過軟中斷向核心發出明確的請求。(eg:sysenter)

作業系統提供api和系統呼叫的關係

一般每個系統呼叫對應乙個封裝例程。

庫再用這些封裝例程定義給使用者的api.

不是每個api對應乙個特定系統呼叫

返回值:1.大部分封裝例程返回乙個整數,值含義依賴於相應的系統呼叫;

2.-1,多數情況——核心不滿足程序請求。

3.libc定義errno變數包含特定出錯碼

使用者態程序——(呼叫)——>系統呼叫

cpu——(切換)———內態核執行乙個核心函式

linux中,通過執行int $0x80執行系統呼叫的,此彙編指令產生向量為128的程式設計異常。

中斷向量0x80與system_call繫結起來

系統呼叫號將xyz和sys_xyz關聯起來了。

系統呼叫三層皮 api xyz,中斷向量system_call,中斷服務程式sys_xyz

system_call:linux所有系統呼叫的入口點。

傳參

1.核心實現不同系統呼叫

2.程序必須指明哪個系統呼叫,這需要傳遞乙個名為系統呼叫號的引數。使用eax暫存器傳遞 3.ebx,ecx,edx,esi,edi按照順序存放前五個引數。

4.需要六個或六個以上引數時,應用乙個單獨的暫存器存放指向所有引數在使用者空間位址的指標。

5.返回值用eax

暫存器傳遞引數限制

1.引數長度小於或等於暫存器長度(32位);

2.除系統呼叫號(eax),引數個數不超6個( ebx,ecx,edx,esi,edi,ebp)

進入核心態後,可訪問所有位址空間,通過使用者塊記憶體傳遞資料 下面使用的是getpid的系統呼叫,查表得 則系統呼叫號是20

getpid()函式功能:取得程序識別碼,返回值是程序的id

這裡直接使用getpid庫函式進行系統呼叫。

傳入的引數為null,通過eax傳入,再通過eax將返回值傳回。

系統呼叫傳遞第乙個引數ebx,這裡是null

8行,將ebx清零;

9行,將20放入eax

11行,返回值用eax儲存

總之,int 80觸發中斷,找到中斷向量表,從表中尋找中斷向量(或中斷門),通過中斷向量,找到系統呼叫表,

找到system_call jmp eax*4+system_table

(-14是實驗出現了錯誤,使用了錯誤的系統呼叫號)

需要闡明自己對「系統呼叫的工作機制」的理解。

應用程式應該以某種方式(庫函式或彙編**)通知系統

告訴核心自己需要執行乙個系統呼叫,希望系統切換到核心態。

核心就可以代表應用程式在核心空間執行系統呼叫。

通知核心的機制是靠軟中斷實現的:

通過引發異常將系統切換核心態執行異常處理程式(系統呼叫處理程式)。

註明「鄭偉 + 參考書《核心分析與實現》 + 《linux核心分析》mooc課程

系統呼叫的工作機制

談起系統呼叫,不得不提一下linux下對檔案操作的兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思,面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採...

Linux核心分析之四 系統呼叫的工作機制

linux核心分析 mooc課程 學過計算機作業系統的都知道,cpu工作時有兩種狀態,一種是使用者態,一種是核心態,使用者態意味著 訪問的範圍會受到限制,在32位x86的機器上,4g的記憶體裡,在使用者態的時候,只能訪問0x00000000 0xbfffffff的位址空間。而核心態則不受限制,可以訪...

Windows系統呼叫機制

記錄一下自己學習windows系統呼叫機制的過程。當呼叫乙個windows api時,系統會由使用者態切入到核心態,從ring3進入到ring0層。下面結合乙個例子來學習一下具體過程。這是乙個demo程式,只呼叫了createfile,我們用ollydbg看一下,它的具體流程是怎樣的。include...