進程上下文與中斷上下文的理解

一.什么是內核態和用戶態

?

內核態:在內核空間執行,通常是驅動程序,中斷相關程序,內核調度程序,內存管理及其操作程序。

用戶態:用戶程序運行空間。

二.什么是進程上下文與中斷上下文

1.進程上下文:

(1)進程上文:其是指進程由用戶態切換到內核態是需要保存用戶態時cpu寄存器中的值,進程狀態以及堆棧上的內容,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行。

(2)進程下文:其是指切換到內核態后執行的程序,即進程運行在內核空間的部分。

2.中斷上下文:

(1)中斷上文:硬件通過中斷觸發信號,導致內核調用中斷處理程序,進入內核空間。這個過程中,硬件的一些變量和參數也要傳遞給內核,內核通過這些參數進行中斷處理。中斷上文可以看作就是硬件傳遞過來的這些參數和內核需要保存的一些其他環境(主要是當前被中斷的進程環境。

(2)中斷下文:執行在內核空間的中斷服務程序。

三.為什么要進行不同之間狀態的切換

在現在操作系統中,內核功能模塊運行在內核空間,而應用程序運行在用戶空間。現代的CPU都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,其所擁有的資源也不同;在較低的級別中將禁止使用某些處理器的資源。Linux系統設計時利用了這種硬件特性,使用了兩個級別,最高級別和最低級別,內核運行在最高級別(內核態),這個級別幾乎可以使用處理器的所有資源,而應用程序運行在較低級別(用戶態),在這個級別的用戶不能對硬件進行直接訪問以及對內存的非授權訪問。內核態和用戶態有自己的內存映射,即自己的地址空間。

當工作在用戶態的進程想訪問某些內核才能訪問的資源時,必須通過系統調用或者中斷切換到內核態,由內核代替其執行。進程上下文中斷上下文就是完成這兩種狀態切換所進行的操作總稱。我將其理解為保存用戶空間狀態是上文,切換后在內核態執行的程序是下文。

四.什么情況下進行用戶態到內核態的切換

1.進程上下文主要是異常處理程序和內核線程。內核之所以進入進程上下文是因為進程自身的一些工作需要在內核中做。例如,系統調用是為當前進程服務的,異常通常是處理進程導致的錯誤狀態等。

2.中斷上下文是由于硬件發生中斷時會觸發中斷信號請求,請求系統處理中斷,執行中斷服務子程序。

五.中斷上下文代碼中注意事項

運行于進程上下文的內核代碼是可搶占的,但中斷上下文則會一直運行至結束,不會被搶占。所以中斷處理程序代碼要受到一些限制,在中斷代碼中不能出現實現下面功能的代碼:

(1)睡眠或者放棄CPU。
因為內核在進入中斷之前會關閉進程調度,一旦睡眠或者放棄CPU,這時內核無法調度別的進程來執行,系統就會死掉。牢記:中斷服務子程序一定不能睡眠(或者阻塞)。

(2)嘗試獲得信號量
如果獲得不到信號量,代碼就會睡眠,導致(1)中的結果。

(3)執行耗時的任務
中斷處理應該盡可能快,因為如果一個處理程序是IRQF_DISABLED類型,他執行的時候會禁止所有本地中斷線,而內核要響應大量服務和請求,中斷上下文占用CPU時間太長會嚴重影響系統功能。中斷處理程序的任務盡可能放在中斷下半部執行。

?

(4)訪問用戶空間的虛擬地址
因為中斷運行在內核空間。

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

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

相關文章

GDB調試教程:1小時玩轉Linux gdb命令

原文鏈接&#xff1a;http://c.biancheng.net/gdb/ GDB 入門教程 本教程以下面的代碼為例&#xff0c;在 Linux 系統下來講解 GBD 的調試流程&#xff1a; int main (void) {unsigned long long int n, sum;n 1;sum 0;while (n < 100){sum sum n;n n 1;}return 0; …

shell將命令執行的結果賦值給 變量

https://blog.csdn.net/lemontree1945/article/details/79126819/

Linux下shell腳本指定程序運行時長

https://www.cnblogs.com/yychuyu/p/12626798.html

vim編輯器如何刪除一行或者多行內容

http://blog.itpub.net/69955379/viewspace-2681334/

C++經典問題:如果對象A中有對象成員B,對象B沒有默認構造函數,那么對象A必須在初始化列表中初始化對象B?

對象成員特點總結&#xff1a; &#xff08;1&#xff09;實例化對象A時&#xff0c;如果對象A有對象成員B,那么先執行對象B的構造函數&#xff0c;再執行A的構造函數。 &#xff08;2&#xff09;如果對象A中有對象成員B,那么銷毀對象A時&#xff0c;先執行對象A的析構函數&…

JZ2440用U-Boot給Nand-Flash燒寫程序時報錯:NAND write: incorrect device type in bootloader ‘bootloader‘ is not

JZ2440開發板使用問題&#xff0c;U-Boot燒寫程序到Nand Flash時報錯&#xff1a;NAND write: incorrect device type in bootloader bootloader is not a number 這是因為分區名中u-boot&#xff0c;不是bootloader&#xff0c;而cmd_menu.c里用的是bootloader 可以執行&#…

韋東山銜接班——4.4_構建根文件系統之構建根文件系統

文章地址&#xff1a; https://blog.csdn.net/gongweidi/article/details/100086289?biz_id102&utm_term%E9%9F%A6%E4%B8%9C%E5%B1%B1%E8%A1%94%E6%8E%A5%E7%8F%AD&utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-5-100086289&…

C++中const char *p和char const *p

const char *p;他的意思是p指向的目標空間的內容不可變化 例如定義char cA; p&c;則c的內容不可以變化.如cB;等一些企圖改變變量c的值的做法都不行. 然而p仍然是動態的,就是它還可以指向別的空間,被賦予新的地址值,只是被他指向的目標空間的內容不可變化,如上面的c值始終為A…

qt 分割字符串的兩種方法

https://blog.csdn.net/a724699769/article/details/62216435

【YOLO系列】YOLOv3代碼詳解(五):utils.py腳本

前言 以下內容僅為個人在學習人工智能中所記錄的筆記&#xff0c;先將目標識別算法yolo系列的整理出來分享給大家&#xff0c;供大家學習參考。 本文僅對YOLOV3代碼中關鍵部分進行了注釋&#xff0c;未掌握基礎代碼的鐵汁可以自己百度一下。 若文中內容有誤&#xff0c;希望大家…

內核的Makefile與Kconfig關系解析

在子目錄下的Kconfig里添加make menuconfig的選項&#xff08;如圖一&#xff09;&#xff0c;并默認設置為y&#xff0c;make menuconfig的菜單里就會有該項并默認為選上狀態&#xff0c;make menuconfig配置完之后在.config文件里就有該選項&#xff0c;并等于y&#xff08;如…

C語言extern的用法

在x.c文件里定義如&#xff1a;int x 100; 在x.h文件里聲明如&#xff1a;extern int x; 然后在main.c里 #include "x.h"即可 或者直接在main.c里 extern int x; 而不使用#include "x.h"&#xff08;此時x.h里當然也不用extern int x;&#xff09;也…

C語言中.和->區別

結構體變量用 . 運算符來訪問結構體的成員 struct A { int a; int b; };A object; object.a 1;指向結構體的指針用->來訪問其指向的結構體的成員 A *point malloc(sizeof(struct A)); point->a 1;

Qt中定時器使用的兩種方法

https://blog.csdn.net/qq_28877125/article/details/88389559

【深度】韋東山:一文看看盡linux對中斷處理的前世今生

https://blog.csdn.net/thisway_diy/article/details/104848034

u-boot中filesize環境變量

U-Boot中的環境命令可以使用$(filesize)來確定剛下載(傳輸)得到的文件大小. 因為使用類似tftp命令傳輸文件后&#xff0c;會自動更新filesize環境變量。 如:setenv updaterootfs nand write.yaffs 30000000 200000 $(filesize) 這時如果printenv,會發現updaterootfsnand write…

make menuconfig選擇m編譯為驅動模塊

之前看過各種文章說在make menuconfig的時候把某個選項配置為m&#xff0c;那就是要把該驅動編譯為模塊&#xff0c;但是在make uImage之后&#xff0c;在對應目錄卻沒有生成.ko文件&#xff08;只有built-in.o&#xff09; 后來才知道是要在執行一遍make modules才會生成.ko文…

Linux下Modules的概念及使用詳解

https://www.cnblogs.com/flintlovesam/p/5909782.html https://zhidao.baidu.com/question/270286794.html

QT使用SQLite數據庫實現登錄功能

QT實現用戶登錄功能&#xff08;MySQL&#xff09; https://blog.csdn.net/tianya_team/article/details/72566198 QT5中使用SQLite https://blog.csdn.net/weixin_41656968/article/details/80473137 Qt-多界面編程&#xff08;界面切換&#xff09; https://blog.csdn.n…