[Linux]內核如何對信號進行捕捉

要理解Linux中內核如何對信號進行捕捉,我們需要很多前置知識的理解:

  • 內核態和用戶態的區別
  • CPU指令集權限
  • 內核態和用戶態之間的切換

由于文章的側重點不同,上面這些知識我會在這篇文章盡量詳細提及,更詳細內容還得請大家查看這篇文章:
內核態與用戶態詳解


一、內核態和用戶態的區別

內核態和用戶態本質上是對CPU狀態的描述。內核態的權限最大,能夠執行一切“特權代碼”。而用戶態則受限制,必須切換到內核態才能執行“特權代碼”。

這就意味著內核態能夠調度全部硬件資源,本質上就是對權限進行保護。由于硬件資源非常復雜,稍有不慎就會出現很大的問題,所以不是人人都有權限去調度。這樣做就是為了安全性和穩定性。


二、CPU指令集權限

具體來說每一條匯編指令都對應一條CPU指令,非常多的CPU指令組成了CPU指令集。指令集則通過CPU實現軟件對硬件的調度
同時CPU指令有分級權限。CPU指令能夠操作硬件資源,硬件資源是非常復雜的,很容易出問題。所以操作系統直接屏蔽掉用戶對CPU指令集的操作

CPU指令分級總共有四級,從高到低依次為:

  • ring0
  • ring1
  • ring2
  • ring3

Linux系統僅采用ring0和ring3這2個權限。用戶態的程序工作在3,內核態的程序處于0:

  • ring0權限最高,可以使用所有CPU指令集,有對硬件的所有操作權限
  • ring3權限最低,僅能使用常規CPU指令集,不能使用操作硬件資源的CPU指令集。代碼沒有對硬件的直接控制權限,也不能直接訪問地址的內存,程序是通過調用系統接口(System Call APIs)來達到訪問硬件和內存

三、內核態和用戶態之間的切換

1.如何理解進程切換?

  • 在當前進程的進程地址空間中的內核空間,找到操作系統的代碼和數據。
  • 執行操作系統的代碼,將當前進程的代碼和數據剝離下來,并換上另一個進程的代碼和數據。

注意: 當你訪問用戶空間時你必須處于用戶態,當你訪問內核空間時你必須處于內核態

從用戶態切換為內核態通常有如下幾種情況:

  • 需要進行系統調用時。
  • 當前進程的時間片到了,導致進程切換。
  • 產生異常、中斷、陷阱等。

與之相對應,從內核態切換為用戶態有如下幾種情況:

  • 系統調用返回時。
  • 進程切換完畢。
  • 異常、中斷、陷阱等處理完畢。

其中,由用戶態切換為內核態我們稱之為陷入內核。每當我們需要陷入內核的時,本質上是因為我們需要執行操作系統的代碼,比如系統調用函數是由操作系統實現的,我們要進行系統調用就必須先由用戶態切換為內核態

2.系統調用

用戶態要主動切換到內核態要有統一的入口,它們就是內核提供的系統調用接口,下面是Linux整體架構圖:
在這里插入圖片描述
我們可以看出來通過系統調用將Linux整個體系分為內核態和用戶態,而內核提供了一組通用的訪問接口,它們使應用程序能訪問到內核的資源,如CPU、內存、I/O,這些接口就叫系統調用


四、內核如何實現信號的捕捉?

當我們在執行主控制流程的時候,可能因為某些情況而陷入內核,當內核處理完畢準備返回用戶態時,就需要進行信號pending的檢查。(此時仍處于內核態,有權力查看當前進程的pending位圖)

在查看pending位圖時,如果發現有未決信號,并且該信號沒有被阻塞,那么此時就需要該信號進行處理。

1.待處理信號是默認或忽略

如果待處理信號的處理動作是默認或者忽略,則執行該信號的處理動作后清除對應的pending標志位,如果沒有新的信號要遞達,就直接返回用戶態,從主控制流程中上次被中斷的地方繼續向下執行即可。
在這里插入圖片描述

2.待處理信號是自定義捕捉的

但如果待處理信號是自定義捕捉的,即該信號的處理動作是由用戶提供的,那么處理該信號時就需要先返回用戶態執行對應的自定義處理動作,執行完后再通過特殊的系統調用sigreturn再次陷入內核并清除對應的pending標志位,如果沒有新的信號要遞達,就直接返回用戶態,繼續執行主控制流程的代碼。
在這里插入圖片描述
注意: sighandler和main函數使用不同的堆棧空間,它們之間不存在調用和被調用的關系,是兩個獨立的控制流程。

3.巧記

當待處理信號是自定義捕捉時的情況比較復雜,可以借助下圖進行記憶:
在這里插入圖片描述
其中,該圖形與直線有4個交點就代表在這期間有4次狀態切換,而箭頭的方向就代表著此次狀態切換的方向,圖形中間的圓點就代表著檢查pending表


當識別到信號的處理動作是自定義時,能直接在內核態執行用戶空間的代碼嗎?不能!!!

  • 理論上來說是可以的,因為內核態是一種權限非常高的狀態,但是絕對不能這樣設計。
  • 如果允許在內核態直接執行用戶空間的代碼,那么用戶就可以在代碼中設計一些非法操作,比如清空數據庫等,雖然在用戶態時沒有足夠的權限做到清空數據庫,但是如果是在內核態時執行了這種非法代碼,那么數據庫就真的被清空了,因為內核態是有足夠權限清空數據庫的。
  • 也就是說,不能讓操作系統直接去執行用戶的代碼,因為操作系統無法保證用戶的代碼是合法代碼,即操作系統不信任任何用戶。

特別鳴謝:
Linux進程信號
內核態與用戶態詳解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87518.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式-觀察者模式、命令模式

觀察者模式Observer(觀察者)—對象行為型模式定義:定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一主題對象,在它的狀態發生變化時,會通知所有的觀察者.先將 Observer A B C 注冊到 Observable ,那么當 Observable 狀態…

【Unity筆記01】基于單例模式的簡單UI框架

單例模式的UIManagerusing System.Collections; using System.Collections.Generic; using UnityEngine;public class UIManager {private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefab…

深入解析 OPC UA:工業自動化與物聯網的關鍵技術

在當今快速發展的工業自動化和物聯網&#xff08;IoT&#xff09;領域&#xff0c;數據的無縫交換和集成變得至關重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作為一種開放的、跨平臺的工業通信協議&#xff0c;正在成為這一領域的…

MCP 協議的未來發展趨勢與學習路徑

MCP 協議的未來發展趨勢 6.1 MCP 技術演進與更新 MCP 協議正在快速發展&#xff0c;不斷引入新的功能和改進。根據 2025 年 3 月 26 日發布的協議規范&#xff0c;MCP 的最新版本已經引入了多項重要更新&#xff1a; 1.HTTP Transport 正式轉正&#xff1a;引入 Streamable …

硬件嵌入式學習路線大總結(一):C語言與linux。內功心法——從入門到精通,徹底打通你的任督二脈!

嵌入式工程師學習路線大總結&#xff08;一&#xff09; 引言&#xff1a;C語言——嵌入式領域的“屠龍寶刀”&#xff01; 兄弟們&#xff0c;如果你想在嵌入式領域闖出一片天地&#xff0c;C語言就是你手里那把最鋒利的“屠龍寶刀”&#xff01;它不像Python那樣優雅&#xf…

MCP server資源網站去哪找?國內MCP服務合集平臺有哪些?

在人工智能飛速發展的今天&#xff0c;AI模型與外部世界的交互變得愈發重要。一個好的工具不僅能提升開發效率&#xff0c;還能激發更多的創意。今天&#xff0c;我要給大家介紹一個寶藏平臺——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一個…

修改Spatial-MLLM項目,使其專注于無人機航拍視頻的空間理解

修改Spatial-MLLM項目&#xff0c;使其專注于無人機航拍視頻的空間理解。以下是修改方案和關鍵代碼實現&#xff1a; 修改思路 輸入處理&#xff1a;將原項目的視頻文本輸入改為單一無人機航拍視頻/圖像輸入問題生成&#xff1a;自動生成空間理解相關的問題&#xff08;無需用戶…

攻防世界-Reverse-insanity

知識點 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步驟 方法一&#xff1a;IDA 使用exeinfo打開&#xff0c;發現是32位ELF文件&#xff0c;然后用ida32打開。 找到main函數&#xff0c;然后F5反編譯&#xff0c;得到flag。 tip&#xff1a;該程序是根據隨機函數生成…

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目

P2PApp下面給出一個基于 RESTful 風格的 P2PApp 管理方案示例,供二次開發或 API 對接參考。核心思路就是把每個 P2PApp 當成一個可創建、查詢、修改、啟動/停止、刪除的資源來管理。 一、P2PApp 資源模型 P2PApp:id: string # 唯一標識name: string # …

邊緣設備上部署模型的限制之一——顯存占用:模型的參數量只是冰山一角

邊緣設備上部署模型的限制之一——顯存占用&#xff1a;模型的參數量只是冰山一角 在邊緣設備上部署深度學習模型已成為趨勢&#xff0c;但資源限制是其核心挑戰之一。其中&#xff0c;顯存&#xff08;或更廣義的內存&#xff09;占用是開發者們必須仔細考量的重要因素。許多…

腦機新手指南(二十一)基于 Brainstorm 的 MEG/EEG 數據分析(上篇)

一、腦機接口與神經電生理技術概述 腦機接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一種在大腦與外部設備之間建立直接通信通道的技術&#xff0c;它通過采集和分析大腦信號來實現對設備的控制或信息的輸出。神經電生理信號作為腦機接口的重要數據來源&…

[Linux]內核態與用戶態詳解

內核態和用戶態是針對CPU狀態的描述。在內核態可以執行一切特權代碼&#xff0c;在用戶態只能執行那些受限級別的代碼。如果需要調用特權代碼需要進行內核態切換。 一、內核態和用戶態概況 內核態&#xff1a; 系統中既有操作系統的程序&#xff0c;也有普通用戶程序。為了安…

如何查看每個磁盤都安裝了哪些軟件或程序并卸載?

步驟如下&#xff1a; 1、點擊電腦桌面左下角&#xff1a; 2、選擇【應用和功能】 3、點擊下拉框&#xff0c;選擇想要查看的磁盤&#xff0c;下方顯示的就是所有C磁盤下安裝的軟件和程序 卸載方法&#xff1a; 點擊對應的應用&#xff0c;然后點擊卸載即可&#xff1a;

記錄一次莫名奇妙的跨域502(badgateway)錯誤

這里圖片加載不了&#xff0c;原文請訪問&#xff1a;原文鏈接 公司的項目&#xff0c;這幾天添加了一個統計功能&#xff0c; 本地測試沒太大問題&#xff0c;上線后有一個問題&#xff0c;具體現象描述如下&#xff1a; 統計首頁接口大約有5-6個&#xff0c;也就是同時需要…

Linux之線程

Linux之線程 線程之形線程接口線程安全互斥鎖條件變量&信號量生產者與消費者模型線程池 線程之形 進程是資源分配的基本單位&#xff0c;而線程是進程內部的一個執行單元&#xff0c;也是 CPU 調度的基本單位。 線程之間共享進程地址空間、文件描述符與信號處理&#xff0…

snail-job的oracle sql(oracle 11g)

官網版本的oracle sql中有自增主鍵&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和觸發器的方式自增主鍵。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必須使用JDK17&#xff0c; jdk8會報錯&#xff0c;所以最后沒用起來&#xff09; /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置對Springboot應用的訪問代理

前置博文 Windows VMWare Centos環境下安裝Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot應用https://blog.csdn.net/u013224722/article/details/148958480 # 將已存在的容器設置為宿主機重啟后…

暑期數據結構第一天

暑期數據結構第一天 數據元素與數據對象 數據元素--組成數據的基本單位 與數據的關系&#xff1a;是集合的個體 數據對象--性質相同的數據元素的集合 與數據的關系&#xff1a;集合的子集 邏輯結構 &#xff08;1&#xff09;線性結構&#xff0c;所有結點都最多有一個直…

vsCode 擴展中 package.nls.json 文件的作用國際化支持

package.nls.json 代表英文語言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …

結構型智能科技的關鍵可行性——信息型智能向結構型智能的轉換(提綱)

結構型智能科技的關鍵可行性 ——信息型智能向結構型智能的轉換 1.信息型智能科技概述 1.1傳統計算機科技的信息型繼承者 1.2 信息型智能環境 1.3信息型智能主體 1.4機器學習創造的智能 1.5信息型智能科技的問題 2.結構型智能科技概述 2.1傳統計算機科技向真實生命結構…