系統呼叫列表參見一、前情提要
系統呼叫
作業系統為使用者態程序與硬體裝置進行互動提供了一組介面
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(-14是實驗出現了錯誤,使用了錯誤的系統呼叫號)8行,將ebx清零;
9行,將20放入eax
11行,返回值用eax儲存
總之,int 80觸發中斷,找到中斷向量表,從表中尋找中斷向量(或中斷門),通過中斷向量,找到系統呼叫表,
找到system_call jmp eax*4+system_table
需要闡明自己對「系統呼叫的工作機制」的理解。
應用程式應該以某種方式(庫函式或彙編**)通知系統註明「鄭偉 + 參考書《核心分析與實現》 + 《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...