色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux內核信號是如何處理的?看完全懂了……

電子設計 ? 來源:互聯網 ? 作者:佚名 ? 2017-11-16 05:11 ? 次閱讀

本文簡單介紹下Linux信號處理機制,為介紹二進制翻譯下信號處理機制做一個鋪墊。
本文主要參考書目《Linux內核源代碼情景分析》《獨辟蹊徑品內核:Linux內核源代碼導讀》
首先,先說一下什么是信號。信號本質上是在軟件層次上對中斷機制的一種模擬,其主要有以下幾種來源:

程序錯誤:除零,非法內存訪問…

外部信號:終端Ctrl-C產生SGINT信號,定時器到期產生SIGALRM…

顯式請求:kill函數允許進程發送任何信號給其他進程或進程組。

在Linux下,可以通過以下命令查看系統所有的信號:

kill-l

可以通過類似下面的命令顯式的給一個進程發送一個信號:

kill-2pid

上面的命令將2號信號發送給進程id為pid的進程。不存在編號為0的信號。

目前Linux支持64種信號。信號分為非實時信號(不可靠信號)和實時信號(可靠信號)兩種類型,對應于 Linux 的信號值為 1-31 和 34-64。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達。本文著重于Linux的信號處理機制,對信號更多的介紹可以參考這里。

一般情況下一個進程接受到信號后,會有如下的行為:

進程對信號的響應

忽略信號:大部分信號可被忽略,除SIGSTOP和SIGKILL信號外(這是超級用戶殺掉或停掉任意進程的手段)。

捕獲信號:注冊信號處理函數,它對產生的特定信號做處理。

讓信號默認動作起作用:unix內核定義的默認動作,有5種情況:

a) 流產abort:終止進程并產生core文件。

b) 終止stop:終止進程但不生成core文件。

c) 忽略:忽略信號。

d) 掛起suspend:掛起進程。

e) 繼續continue:若進程是掛起的,則resume進程,否則忽略此信號。

注冊信號處理函數

如果想要進程捕獲某個信號,然后作出相應的處理,就需要注冊信號處理函數。同中斷類似,內核也為每個進程準備了一個信號向量表,信號向量表中記錄著每個信號所對應的處理機制,默認情況下是調用默認處理機制。當進程為某個信號注冊了信號處理程序后,發生該信號時,內核就會調用注冊的函數。

注冊信號處理函數是通過系統調用signal()、sigaction()。其中signal()在可靠信號系統調用的基礎上實現, 是庫函數。它只有兩個參數,不支持信號傳遞信息,主要是用于前32種非實時信號的安裝;而sigaction()是較新的函數(由兩個系統調用實 現:sys_signal以及sys_rt_sigaction),有三個參數,支持信號傳遞信息,主要用來與 sigqueue() 系統調用配合使用,當然,sigaction()同樣支持非實時信號的安裝。sigaction()優于signal()主要體現在支持信號帶有參數。關于這方面的內容,如果想獲取更多,也可參考這里。

Linux下信號處理機制

進程如何發現和接受信號?

我們知道,信號是異步的,一個進程不可能等待信號的到來,也不知道信號會到來,那么,進程是如何發現和接受信號呢?實際上,信號的接收不是由用戶進程來完成的,而是由內核代理。當一個進程P2向另一個進程P1發送信號后,內核接受到信號,并將其放在P1的信號隊列當中。當P1再次陷入內核態時,會檢查信號隊列,并根據相應的信號調取相應的信號處理函數。如下圖所示:


其中,動作c:發現和捕捉信號

信號檢測和響應時機

剛才我們說,當P1再次陷入內核時,會檢查信號隊列。那么,P1什么時候會再次陷入內核呢?陷入內核后在什么時機會檢測信號隊列呢?

當前進程由于系統調用、中斷或異常而進入系統空間以后,從系統空間返回到用戶空間的前夕。

當前進程在內核中進入睡眠以后剛被喚醒的時候(必定是在系統調用中),或者由于不可忽略信號的存在而提前返回到用戶空間。

進入信號處理函數

發現信號后,根據信號向量,知道了處理函數,那么該如何進入信號處理程序,又該如何返回呢?

我們知道,用戶進程提供的信號處理函數是在用戶態里的,而我們發現信號,找到信號處理函數的時刻處于內核態中,所以我們需要從內核態跑到用戶態去執行信號處理程序,執行完畢后還要返回內核態。這個過程如下圖所示:

如圖中所見,處理信號的整個過程是這樣的:進程由于 系統調用或者中斷 進入內核,完成相應任務返回用戶空間的前夕,檢查信號隊列,如果有信號,則根據信號向量表找到信號處理函數,設置好“frame”后,跳到用戶態執行信號處理函數。信號處理函數執行完畢后,返回內核態,設置“frame”,再返回到用戶態繼續執行程序。

在上面這段話中,我提到“frame”,frame是什么?那么為什么要設置frame?為什么在執行完信號處理函數后還要返回內核態呢?

什么叫Frame?

在調用一個子程序時,堆棧要往下(邏輯意義上是往上)伸展,這是因為需要在堆棧中保存子程序的返回地址,還因為子程序往往有局部變量,也要占用堆棧中的空間。此外,調用子程序時的參數也是在堆棧中。子程序調用嵌套越深,則堆棧伸展的層次也越多。在堆棧中的每一個這樣的層次,就稱為一個”框架”,即frame。

一般來說,當子程序和調用它的程序在同一空間中時,堆棧的伸展,也就是堆棧中框架的建立,過程主要如下:

call指令將返回地址壓入堆棧(自動)

用push指令壓入調用參數

調整堆棧指針來分配局部變量

為什么以及怎么設置frame?

我們知道,當進程陷入內核態的時候,會在堆棧中保存中斷現場。因為用戶態和內核態是兩個運行級別,所以要使用兩個不同的棧。當用戶進程通過系統調用剛進入內核的時候,CPU會自動在該進程的內核棧上壓入下圖所示的內容:(圖來自《Linux內核完全注釋》)

在處理完系統調用以后,就要調用do_signal()函數進行設置frame等工作。這時內核堆棧的狀態應該跟下圖左半部分類似(系統調用將一些信息壓入棧了):

在找到了信號處理函數之后,do_signal函數首先把內核堆棧中存放返回執行點的eip保存為old_eip,然后將eip替換為信號處理函數的地址,然后將內核中保存的“原ESP”(即用戶態棧地址)減去一定的值,目的是擴大用戶態的棧,然后將內核棧上的內容保存到用戶棧上,這個過程就是設置frame.值得注意的是下面兩點:

之所以把EIP的值設置成信號處理函數的地址,是因為一旦進程返回用戶態,就要去執行信號處理程序,所以EIP要指向信號處理程序而不是原來應該執行的地址。

之所以要把frame從內核棧拷貝到用戶棧,是因為進程從內核態返回用戶態會清理這次調用所用到的內核棧(類似函數調用),內核棧又太小,不能單純的在棧上保存另一個frame(想象一下嵌套信號處理),而我們需要EAX(系統調用返回值)、EIP這些信息以便執行完信號處理函數后能繼續執行程序,所以把它們拷貝到用戶態棧以保存起來。

以上這些搞清楚之后,下面的事情就順利多了。這時進程返回用戶空間,就會根據內核棧中的EIP值執行信號處理函數。那么,信號處理程序執行完后,怎么返回程序繼續執行呢?

信號處理函數執行完后怎么辦?

信號處理程序執行完畢之后,進程會主動調用sigreturn()系統調用再次回到內核,查看有沒有其他信號需要處理,如果沒有,這時內核就會做一些善后工作,將之前保存的frame恢復到內核棧,恢復eip的值為old_eip,然后返回用戶空間,程序就能夠繼續執行。至此,內核遍完成了一次(或幾次)信號處理工作。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209331
  • 數字信號處理

    關注

    15

    文章

    560

    瀏覽量

    45844
  • IP內核
    +關注

    關注

    0

    文章

    13

    瀏覽量

    12801
收藏 人收藏

    評論

    相關推薦

    AFE5809EVM GUI如何處理低頻信號

    請教如何處理低頻信號。 對AFE5809EVM GUI進行如下圖設置,請問是否正確。
    發表于 12-09 07:04

    LMX2572LP如果輸入是單端信號,OSC_INM不用,應該如何處理

    我司現用到LMX2572LP,請問如果輸入是單端信號,OSC_INM不用,應該如何處理? 1.我看手冊上的應用圖是打了一個×,應該是懸空的意思。 2.不過,我看LMX2572LP的評估板接了些元件 那么,我到底應該怎么處理
    發表于 11-13 06:43

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?499次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是Linux驅動開發的基礎。在編
    的頭像 發表于 08-30 15:02 ?444次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?483次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?279次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?826次閱讀

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux中實現實時計算性能,進而有效地將Linux轉變為RTOS,那么大多數發行版都可以打上名為PREE
    的頭像 發表于 04-12 08:36 ?2421次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>

    導熱油管道漏油應該如何處理

    電子發燒友網站提供《導熱油管道漏油應該如何處理.docx》資料免費下載
    發表于 03-06 15:41 ?0次下載

    減速機滲油問題如何處理

    電子發燒友網站提供《減速機滲油問題如何處理.docx》資料免費下載
    發表于 03-05 09:18 ?2次下載

    Ubuntu 24.04 LTS選用Linux 6.8為默認內核

    關于Ubuntu 24.04 LTS使用何種內核版本,一直備受關注。Canonical工程師Andrea Righi昨日宣布,Ubuntu 24.04將默認搭載Linux 6.8內核
    的頭像 發表于 01-29 11:27 ?1087次閱讀

    Linux內核信號的傳遞過程

    前面我們已經介紹了內核注意到信號的到來,調用相關函數更新進程描述符以便進程接收處理信號。但是,如果目標進程此時沒有運行,內核則推遲傳遞
    的頭像 發表于 01-17 09:51 ?1153次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中<b class='flag-5'>信號</b>的傳遞過程

    一文詳解Linux內核-信號的產生過程

    許多內核函數產生信號:它們完成信號處理的第一階段,也就是更新一個或多個進程描述符。
    的頭像 發表于 01-13 13:48 ?1304次閱讀

    Linux內核信號詳解

    5.18.18的定義 4.2.4 ARM/linux5.18.18的定義 4.2.5 RISC-V/linux6.7 4.1 信號描述符和信號處理
    的頭像 發表于 01-13 09:40 ?1371次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中<b class='flag-5'>信號</b>詳解

    rk3399移植Linux內核

    RK3399是一款由中國廠商瑞芯微推出的高性能處理器芯片,被廣泛用于嵌入式系統開發。在進行應用程序開發之前,我們需要將Linux內核移植到RK3399上,以支持硬件的驅動和功能。本文將詳細介紹如何將
    的頭像 發表于 01-08 09:56 ?1125次閱讀
    主站蜘蛛池模板: 欧美另类一区| 一边喂奶一边做边爱| 7723手机游戏破解版下载| 国产精品亚洲电影久久成人影院 | 亚洲七七久久桃花综合| 成人免费网址在线| 老师湿乎乎两半嫩| 亚洲AV久久久噜噜噜噜| WWW污污污抽搐喷潮COM| 久久免费看视频| 亚洲精品123区在线观看| 嘟嘟嘟WWW免费高清在线中文| 美女脱了内裤张开腿让男人爽| 亚洲免费久久| 国产精品大陆在线视频| 琪琪午夜福利免费院| 2021乱码精品公司| 吉吉影音先锋av资源网| 无人区在线日本高清免费| 成人精品视频| 欧美一区二区三区久久综| 5g在视影讯天天5g免费观看| 久久AV喷吹AV高潮欧美| 亚洲 欧洲 国产 日产 综合| 国产69精品久久久久乱码韩国 | 白人大战34厘米黑人BD| 免费国产足恋网站| 中文无码字慕在线观看| 精品久久久久久无码人妻国产馆| 无人区尖叫之夜美女姐姐视频| 成人区精品一区二区不卡AV免费| 女张腿男人桶羞羞漫画| 在线中文字幕| 久久精品手机观看| 亚洲中字慕日产2020| 极品美女穴| 亚洲日韩成人| 娇妻在床上迎合男人| 亚洲三级黄色片| 回复术士人生重启在线观看| 亚洲精品电影久久久影院|