1. 程式人生 > >Linux 網路協議棧之核心鎖(四)—— 程序上下文與中斷上下文的理解

Linux 網路協議棧之核心鎖(四)—— 程序上下文與中斷上下文的理解

一.什麼是核心態和使用者態

核心態:在核心空間執行,通常是驅動程式,中斷相關程式,核心排程程式,記憶體管理及其操作程式。

使用者態:使用者程式執行空間。

這裡寫圖片描述

二.什麼是程序上下文與中斷上下文

1.程序上下文:

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

(2)程序下文:其是指切換到核心態後執行的程式,即程序執行在核心空間的部分。

2.中斷上下文:

(1)中斷上文:硬體通過中斷觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理。中斷上文可以看作就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境(主要是當前被中斷的程序環境。

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

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

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

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

四.什麼情況下進行使用者態到核心態的切換

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

2.中斷上下文是由於硬體發生中斷時會觸發中斷訊號請求,請求系統處理中斷,執行中斷服務子程式。

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

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

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

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

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

(4)訪問使用者空間的虛擬地址 
因為中斷執行在核心空間。 

相關推薦

Linux 網路協議核心—— 程序上下文中斷上下文理解

一.什麼是核心態和使用者態 核心態:在核心空間執行,通常是驅動程式,中斷相關程式,核心排程程式,記憶體管理及其操作程式。 使用者態:使用者程式執行空間。 二.什麼是程序上下文與中斷上下文 1.程序上下文: (1)程序上文:其是指程序由使用者態切換到核心態是需

Linux 網路協議開發基礎篇—— VIDPVID

一、PVID的作用及和VID的區別        PVID和VID經常出現於二、三層交換機裡,由於PVID和VID的設定不合理,造成VLAN劃分變得混亂。        PVID是交換機上的概念,說的是進入該埠的報文如果沒有打vlan id就按PVID的值打上,VID是報文

Linux網路協議資料包處理過程(非技術人員勿看)

1.中斷處理函式中:    網絡卡收到一幀------------------------〉   引發中斷-------------------〉   cpu呼叫相應的中斷處理函式(指向此網絡卡驅動中的相應的處理函式)(把此packet讀到ram中)--------------------〉   呼叫neti

Linux 網路協議開發基礎篇十二—— 使用wireshark分析TCP/IP協議中TCP包頭的格式

摘要: 本文簡單介紹了TCP面向連線理論知識,詳細講述了TCP報文各個欄位含義,並從Wireshark俘獲分組中選取TCP連線建立相關報文段進行分析。 一、概述 TCP是面向連線的可靠傳輸協議,兩個程序互發資料之前需要建立連線,這裡的連線只不過是端系統中分配的一些快

【黑馬程式設計師】Objective-C語言學習筆記核心語法

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、點語法 1、沒有使用點語法的情況 此時我們使用setter和gette

MVC實戰排球計分—— View設計實現

service family 角色 元素 需要 rom 之前 con xsl (view)視圖 視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出

Linux 網路協議開發—— 網路協議核心分析

1.1 傳送端 1.1.1 應用層 (1) Socket 應用層的各種網路應用程式基本上都是通過 Linux Socket 程式設計介面來和核心空間的網路協議棧通訊的。Linux Socket 是從 BSD Socket 發展而來的,它是 Linux 作業系統的重要組成部分之一,它是網路應用程式

Linux 網路協議開發程式碼分析篇VLAN—— VLAN收發處理

        以一個例子來說明,當主機收到報文,交由vlan協議模組處理後(vlan_rcv),此時需要更換skb->dev所指向的裝置,以使上層協議認為報文是來自於虛擬網絡卡(比如eth1.1),而不知道網絡卡eth1的存在。更換裝置就需要知道skb->dev更換的目標。這由兩個因素決定:sk

Linux 網路協議開發番外篇—— Windows路由表詳解

一、檢視Windows路由表  路由表是Windows的TCP/IP協議棧的一個重要的部分。但是,路由表不是Windows作業系統向普通使用者顯示的東西。如果你要看到這個路由表,你必須要開啟一個命令提示符對話方塊,然後輸入“ROUTE PRINT”命令。結果如下: 路由

Linux 網路協議開發—— 二層橋轉發藍圖

struct sk_buff *br_handle_vlan(struct net_bridge *br,                      struct net_bridge_vlan_group *vg,                      struct sk_b

linux 核心模組程式設計模組引數

通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組

linux網路協議(五)網路層 (1)L2L3

5.1、L2與L3: 網路的目的是使可以訪問不同主機的資源,僅以最簡單的使用如訪問我們軟體四部閘道器技術組的伺服器,是通過訪問192.168.36.XXX的IP地址達到訪問那臺主機的目的,而我們自己的主機IP都是192.168.10.XXX,我們的主機和閘道器技術組的主機不

linux網路協議()鏈路層 (5)vlan處理

4.6、VLAN處理: 4.6.1、vlan原理 對於帶vlan的乙太網報文,其乙太網型別為0x8100,所以鏈路層中對於帶vlan報文的處理就是對於乙太網型別為0x8100的報文的處理; vlan,用於在鏈路層劃分廣播域,實現資料在鏈路層分流,在二層交換機中,vlan實際

linux網路協議分析筆記14-路由4-FIB3

看完fib的查詢,弄清了一些資料結構的組織,我們再來看看路由表是如何建立的 從ip_fib_init註冊的兩個通知鏈來看,在IP地址傳送變動時會觸發通知鏈的處理函式,都會呼叫fib_add_ifaddr()來新增地址到路由中 這個裡面由呼叫了fib_magic來進行路由地址的操作。 static void

Linux網路協議(二)——套接字快取(socket buffer)

Linux網路核心資料結構是套接字快取(socket buffer),簡稱skb。它代表一個要傳送或處理的報文,並貫穿於整個協議棧。 1、    套接字快取 skb由兩部分組成: (1)    報文資料:它儲存了實際在網路中傳輸的資料; (2)    管理資料:供核心處理報

linux網路協議()鏈路層 (1)鏈路層原理

四:鏈路層: 4.1、鏈路層原理: 4.1.1、鏈路層在幹什麼: 在報文接收方向上,網絡卡驅動把接收到的資料按照其對應的鏈路層協議(如乙太網)組裝成報文,然後把它上交給鏈路層,介面是netif_receive_skb,至此網絡卡驅動的任務就結束了,報文交給鏈路層處理; 在報

Linux 網路協議收訊息過程-Ring Buffer

想看能不能完整梳理一下收訊息過程。從 NIC 收資料開始,到觸發軟中斷,交付資料包到 IP 層再經由路由機制到 TCP 層,最終交

Linux Nginx實戰】初識Nginx

Nginx LNMP 實戰 1.Nginx是什麽? nginx是一款高性能的HTTP和反向代理服務器軟件,第一個開源版本誕生於2004年,雖然誕生較晚但經過十多年的發展,已經成為非常流行的web服務器軟件,下圖是w3techs公布的全球網站服務器軟件統計報告 2.Nginx為什麽流行? 首先,ng

node總結核心模組until

util 是一個Node.js 核心模組,提供常用函式的集合,用於彌補核心JavaScript 的功能 過於精簡的不足,咱們這次就來簡單的看一些關於until的一些函式。 util.inherits(constructor, superConstructor)是一個實現物件間原型繼承 的函式

Java多執行緒系列---“JUC”06 公平

轉自:http://www.cnblogs.com/skywang12345/p/3496609.html 釋放公平鎖(基於JDK1.7.0_40) 1. unlock() unlock()在ReentrantLock.java中實現的,原始碼如下: public void unlock() {