1. 程式人生 > >IRQL(轉載 自 windows核心情景分析)

IRQL(轉載 自 windows核心情景分析)

與此相關,Windows為CPU的執行狀態定義了許多“IRQ級別”,即IRQL。在任一時間中,CPU總是運行於其中的某一個級別,這個級別就表明了什麼事情可以做、什麼事情不可以做。下面是這些級別的定義:

#define PASSIVE_LEVEL                             0

#define LOW_LEVEL                                 0

#define APC_LEVEL                                  1

#define DISPATCH_LEVEL                           2

#define PROFILE_LEVEL                             27

#define CLOCK1_LEVEL                             28

#define CLOCK2_LEVEL                             28

#define IPI_LEVEL                                   29

#define POWER_LEVEL                             30

#define HIGH_LEVEL                                31

其基本的意圖是,如果CPU從而一個執行緒已經處於某個級別,其操作就不能受同級或更低級別的操作所幹擾。

這裡的PASSIVE_LEVEL是級別最低的,但是卻對應著系統結構中較高的層次。當CPU運行於使用者空間,或者雖然進入了核心但還只是運行於管理層的時候,其執行級別就是PASSIVE_LEVEL。比其略高的是APC_LEVEL,那是在(核心中)為APC函式(見本書“程序與執行緒”一章)的執行進行準備時的執行級別,APC請求相當於對使用者空間程式的(軟體)中斷。注意IRQL在x86系統結構中並沒有硬體的支援(CPU中並沒有這麼一個暫存器)而只是一個變數。與CPU只能通過特殊的指令或中斷/異常才能進入系統態不同,IRQL是CPU可以自由設定的,每當CPU進入更底層、更核心的層次時就提高IRQL,反之則降低IRQL。不過,表明IRQL的變數在核心中,運行於使用者空間時是無法改變IRQL的。

再高一級是DISPATCH_LEVEL,這大致相當於CPU運行於Windows核心中的核心層,即“核心”層。執行緒的切換隻能發生於CPU行將從DISPATCH_LEVEL級別下降的時候。

IRQL級別3及以上用於硬體中斷。顯然,設計者的意圖是採用中斷優先順序,即優先順序較高的中斷源可以中斷優先順序較低的中斷服務。但是x86的系統結構並不支援中斷優先順序,所以這實際上是來自VMS的遺蹟,因為VAX和PDP的系統結構都是支援中斷優先順序的。

回到頁面換出的問題上,只要CPU的IRQL級別不高於APC_LEVEL的層次,其程式碼都是允許倒換的,但是從DISPATCH_LEVEL開始就不允許了。顯然,如果在這一點上搞錯了,後果是很嚴重的。所以在管理層的程式碼中幾乎每個函式的開頭都要放上一個巨集操作PAGED_CODE(),說明程式碼作者的意圖是讓這個函式所佔的頁面可以被倒換出去。這個巨集操作的定義如下:

#ifdef DBG

#define PAGED_CODE() { "

  if (KeGetCurrentIrql() > APC_LEVEL) { "

    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)"n",

                                                  KeGetCurrentIrql() )); "

    ASSERT(FALSE); "

  } "

}

#else

#define PAGED_CODE()

#endif

在Debug模式下,這個巨集操作檢查CPU當前的執行級別,如果發現高於APC_LEVEL就說明這個函式有可能在DISPATCH_LEVEL或更高的級別上受到呼叫,因而是不應該被倒換出去的,所以就發出警告。至於在正式執行的版本中,則這個巨集操作定義為空。

當然,光是在程式中引用巨集操作PAGED_CODE()不會使一個函式所在的頁面可倒換,真正使其可倒換的是編譯指示“#pragma alloc_text()”。例如NtQueryObject()中的第一行就是PAGED_CODE(),與此相應,這個函式所在的原始檔中就有這麼一行:

#pragma alloc_text(PAGE, NtQueryObject)

正是這一行編譯指示讓編譯工具將為此函式生成的可執行程式碼放在可被倒換的區間。

相關推薦

IRQL轉載 windows核心情景分析

與此相關,Windows為CPU的執行狀態定義了許多“IRQ級別”,即IRQL。在任一時間中,CPU總是運行於其中的某一個級別,這個級別就表明了什麼事情可以做、什麼事情不可以做。下面是這些級別的定義: #define PASSIVE_LEVEL             

windows核心情景分析---程序執行緒

本篇主要講述程序的啟動過程、執行緒的排程與切換、程序掛靠 一、程序的啟動過程: BOOL CreateProcess (   LPTSTR lpCommandLine,                      // command line string   LPVOI

windows核心情景分析--視窗訊息

訊息與鉤子 眾所周知,Windows系統是訊息驅動的,現在我們就來看Windows的訊息機制. 早期的Windows的視窗圖形機制是在使用者空間實現的,後來為了提高圖形處理效率,將這部分移入核心空間,在Win32k.sys模組中實現。這個模組作為一個擴充套件的核心模組,提高了一個擴充套件額系統服務

Windows核心情景分析-記憶體管理1

簡述 現代意義上的作業系統,就必須提供對核心的保護、對不同使用者程式之間的隔離,並允許軟體的裝入位置浮動。提供這些功能,需要由單獨的記憶體管理來支援。  上圖ALU將程式中的地址計算轉換為虛擬地址(線性地址),然後通過MMU將虛擬地址轉換為實際的實體地址。這些過程

windows核心情景分析--系統呼叫

Windows的地址空間分使用者模式與核心模式,低2GB的部分叫使用者模式,高2G的部分叫核心模式,位於使用者空間的程式碼不能訪問核心空間,位於核心空間的程式碼卻可以訪問使用者空間 一個執行緒的執行狀態分核心態與使用者態,當指令位於使用者空間時,就表示當前處於核心態,當指令位於核心空間時,就處於核心態.

windows核心情景分析讀書筆記-----HYPERSPACE

主要介紹HYPERSPACE的建立對映函式 賞光看我這一系列文章的朋友最好結合毛德操老師的書來看,具體的細節我這裡就不闡述了 簡單說下這個函式功能 Windows核心有時候需要把某些物理頁面臨時對映到核心的虛存空間,用做臨時的用途 #define HYPERSPACE (

windows核心情景分析--記憶體管理

32位系統中有4GB的虛擬地址空間 每個程序有一個地址空間,共4GB,(具體分為低2GB的使用者地址空間+高2GB的核心地址空間) 各個程序的使用者地址空間不同,屬於各程序專有,核心地址空間部分則幾乎完全相同 虛擬地址如0x11111111,  看似這8個數字是一個整體,其實是由三部分組成的,是一個三維地址

windows 核心情景分析 --- 網路通訊

典型的基於tcpip協議套接字方式的網路通訊模組層次: 應用程式 socket api WS2_32.dll socket irp Afd.sys tdi irp Tcpip.sys 回撥函式介面 各Ndis中間層過濾驅動 回撥函式介面 小埠驅動 中斷互動操作 網絡卡 應用程式

windows核心情景分析---執行緒同步

基於同步物件的等待、喚醒機制: 一個執行緒可以等待一個物件或多個物件而進入等待狀態(也叫睡眠狀態),另一個執行緒可以觸發那個等待物件,喚醒在那個物件上等待的所有執行緒。 一個執行緒可以等待一個物件或多個物件,而一個物件也可以同時被N個執行緒等待。這樣,執行緒與等待物件之間是多對多的關係。他們之間的

Windows核心情景分析-概述

現在的Windows 現在的windows核心包含了兩大部分,一部分是本來意麵上的作業系統核心,另一部分則是移到了核心中的視窗服務,前者對應ntoskrnl.exe後者win32k.sys;後者部分為了保證效率。windows作業系統包含多個子系統,最常用就是windo

Windows核心情景分析-系統呼叫2

x86後來加入的快速系統呼叫硬體支援,windows則也跟著做了改動,此時如果cpu支援sysenter,則會採用快速系統呼叫的系統呼叫形式。  快速系統呼叫 sysenter 形式的系統呼叫例項 此時工具生成的NtReadFile為: 此時與int 0

iOS-實現UIScrollview的無限迴圈滑動轉載Kenshin Cui's Blog不過感覺快速滑動還是有缺陷啊

UIScrollView實戰 前面介紹了iOS中UIKit的一些簡單知識,這裡我們一起利用前面的知識做一個例子--圖片無限迴圈滾動。在這個例子中我們需要解決如下兩個問題: 如何無限迴圈? 我們知道在UIScrollView中如果放置其他控制元件後,只要設定conte

Java死鎖範例以及如何分析死鎖轉載ImportNew

ofo index 對象 str wait 就會 moni ask 進入 本文由 ImportNew - 範琦琦 翻譯自 journaldev。歡迎加入翻譯小組。轉載請見文末要求。 死鎖是兩個甚至多個線程被永久阻塞時的一種運行局面,這種局面的生成伴隨著至少兩個線程和兩個或者

設置UWP程序啟動Automate launching Windows 10 UWP apps

con color count ati 用戶 tar 屬性 protected rri 原文:設置UWP程序自啟動(Automate launching Windows 10 UWP apps)在開發UWP程序的過程中,有時候需要設置程序的自啟。本人實現的步驟如下: 1.

Vue.js系列之vue-router(上) 轉載向朔1992

app 指定 路徑和 其他 發現 掛載 我只 router mine 概述 Vue非常適用於實踐單頁面應用程序也就是平時大家說的比較多的SPA(single page application),這點應該了解過Vue的應該都知道吧。一般的單頁面應用是基於路由或頁面之間的鏈接來

Go語言庫之strconv包轉載--http://blog.csdn.net/alvine008/article/details/51283189

整型 print 特殊 imp size 無符號 this http 相差 golang strconv.ParseInt 是將字符串轉換為數字的函數 func ParseInt(s string, base int, bitSize int) (i int64, err

GitLab 實現代碼自動部署轉載https://segmentfault.com/a/1190000011561808

use name 無密碼登錄 row 內容 app mage 請求 XML 在當下使用 GIT 來管理代碼已經是一種非常流行的方式了。使用 GIT 可以很方便的給代碼創建分支,撤銷不需要的提交,與他人合作共同編寫代碼。 GitLab 是基於

什麽是內存泄漏轉載ImportNew

ext .com ole map feedback widget 以及 引用 lib 本文由 ImportNew - 範琦琦 翻譯自 Programcreek。歡迎加入翻譯小組。轉載請見文末要求。 Java最顯著的優勢之一就是它的內存管理機制。你只需簡單創建對象,然後Jav

為什麽在密碼問題上char[]優先於String?轉載ImportNew

參考 java ecc 使用 .html lang ash net 收集 本文由 ImportNew - 範琦琦 翻譯自 stackoverflow。歡迎加入翻譯小組。轉載請見文末要求。 問題 在Swing中,密碼域(JPasswordField)用getPassword(

如何選擇一款合適的密碼管理器轉載ImportNew

conf form 擁有 今天 不能 到你 html 轉載 審計 本文由 ImportNew - 範琦琦 翻譯自 frankel。歡迎加入翻譯小組。轉載請見文末要求。 如何擁有更安全的密碼管理器已經困擾了我多年。起初,我唯一的擔心是不同電腦之間共享書簽和歷史記錄(那時手機還