【學習&理解】Linux下的系統調用過程

来源:https://www.cnblogs.com/aixian/archive/2018/01/20/8319471.html
-Advertisement-
Play Games

在應用程式中,很多時候都會調用到系統調用來完成一些操作,可是系統調用是在內核態下才能調用,用戶態下的應用程式是無法直接調用到的,那麼操作系統是怎麼處理這一過程的呢? 本文的環境是基於Linux 0.11,沒有查證現代操作系統是否有所變化,不過基本思路應該差不多。 過程: 先來看一張圖,有個大概的理解 ...


在應用程式中,很多時候都會調用到系統調用來完成一些操作,可是系統調用是在內核態下才能調用,用戶態下的應用程式是無法直接調用到的,那麼操作系統是怎麼處理這一過程的呢?

本文的環境是基於Linux 0.11,沒有查證現代操作系統是否有所變化,不過基本思路應該差不多。

過程:

先來看一張圖,有個大概的理解。

首先,應用程式能直接調用的是系統提供的API,這個在用戶態(Ring3)下就可做到。

然後相應的API就會將相應的系統調用號保存到eax寄存器中(這一步通過內聯彙編實現),之後就是使用int 0x80觸發中斷(內聯彙編),進入到中斷處理函數中(該函數是完全由彙編代碼編寫),這個時候就進入到了內核態(Ring0)了。

在中斷處理函數中就會調用與系統調用號相對應的那個系統調用。在這個函數中,會把ds、es這兩個寄存器設置為指向內核空間。這樣一來,我們無法把數據從用戶態中傳到內核態啊(如open(const char * filename, int flag, ...)中,filename指針指向的字元串的地址是在用戶空間中的,在內核空間相應的地方取的話根本沒有該字元串),這該怎麼辦呢?中斷處理函數中的fs寄存器被設置為指向了用戶空間,所以問題得以解決。

在系統調用中就是進行相應的操作了,如打開文件、寫文件等。

處理完後,將會返回到中斷處理函數,返回值保存在eax寄存器中。

從中斷處理函數中返回到API,依舊是把返回值保存到eax寄存器中。這個時候就從內核態恢覆成用戶態。

API中從eax中取出值,做相應的判斷返回不同的值,用以表示操作完成情況。

*附加:

為什麼使用int 0x80中斷能調用那麼多系統調用?

在保護模式下,有各種各樣的中斷,而系統調用就和0x80號中斷綁定。當要調用系統調用時,就觸發int 0x80,中斷處理函數就通過eax獲知想要調用的是哪一個系統調用。這樣做的原因是系統調用數量太多,中斷號會不夠用,所以用一個來集中管理。

操作系統中有一個表,是用來保存各個系統調用函數的地址的。這個表是一個數組,所以通過下標就可以訪問到不同函數的地址。故可以做到一個中斷號+各樣的系統調用號就管理多個系統調用。

 

歡迎各位發現錯誤後指出,本人一定及時改正並致以最誠懇的感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.var與dynamic的區別 C#中的很多關鍵詞用法比較容易混淆,var和dynamic就是其中一組,但其實它們是有本質的區別的。var 在編譯階段已經確定類型,在初始化時候,必須提供初始化的值,而dynamic則可以不提供,它是在運行時才確定類型。 2.ExpandoObject類型的使用 當 ...
  • 面向.Net程式員的dump分析 WinDbg調試.NET程式入門 如何用windbg分析64位機上32位程式的dump文件 ...
  • PowerDesigner是一款功能非常強大的建模工具軟體,足以與Rose比肩,同樣是當今最著名的建模軟體之一。Rose是專攻UML對象模型的建模工具,之後才向資料庫建模發展,而PowerDesigner則與其正好相反,它是以資料庫建模起家,後來才發展為一款綜合全面的Case工具。 PowerDes ...
  • PowerDesigner 創建表格及導出SQL語句 目的:提高資料庫創建表格效率 測試資料庫:orcale 1.新建物理模型。 右鍵點擊workplace,new一個物理模型並指定資料庫。 2.創建表格 設置欄位屬性 新增欄位屬性(比如加欄位註釋) 3.導出sql語句及預覽 初次使用會發現orca ...
  • 轉自https://www.cnblogs.com/zuowj/archive/2015/05/04/4475663.html轉別人的,做了一點點改動 樣式類 ...
  • "返回目錄" "原文地址Java" equals() 方法總結 equals() 超類 Object 中有這個 equals() 方法,該方法主要用於比較兩個對象是否相等。該方法的源碼如下: 我們知道所有的對象都擁有標識(記憶體地址)和狀態(數據), 同時“==”比較兩個對象的的記憶體地址 ,所以說使用 ...
  • iptables規則持久化 設定防火牆規則 保存防火牆規則 設定開機自動恢復iptables規則 手動生成一些iptables規則 查看iptables規則是否生效 設定關機時自動保存iptables規則 創建關機時要執行的腳本,並且確保其有執行許可權 創建軟連接文件至rcN.d路徑下,N為運行等級 ...
  • > Vim from zero to hero - Vim 從入門到精通- 原文地址:- 原文作者:Marco Hinz- [簡介](#簡介) - [什麼是 Vim?](#什麼是-vim) - [Vim 哲學](#vim-哲學) - [入門](#入門) - [精簡的 vimrc](#精簡的-vimr... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...