日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

《Undocumented Windows 2000 Secrets》翻譯 --- 第四章(9)

瀏覽:284日期:2023-08-27 11:21:44

第四章 探索 Windows 2000 的內存管理機制

翻譯: Kendiv( fcczj@263.net )

更新: Tuesday, February 22, 2005

聲明:轉載請注明出處,并保證文章的完整性,本人保留譯文的所有權利。

Windows 2000 的分段和描述符

w2k_mem.exe 的另一個很棒的選項是 +e ,該選項將顯示和說明處理器的段寄存器和描述表的內容。 示列 4-13 給出了其典型輸出。 CS 、 DS 和 ES 段寄存器的內容非常清晰的證明了 Windows 2000 為每個進程提供了平坦的 4GB 地址空間:起始于 0x00000000 ,終止于 0xFFFFFFFF 。 示列 4-13 中最右邊的標志符用來表示段的類型,該段的類型由它的描述符的 Type 成員給出。代碼和數據段的 Type 屬性可分別符號化為“ cra ”和“ ewa ”。省略號“ - ”意味著相應的屬性沒有設置。一個任務狀態段( Task State Segment , TSS )僅能有“ a ”(可用)和“ b ”(忙)兩種屬性。 4-5 給出了所有可用的屬性。 示列 4-13 展示了 Windows 2000 的 CS 段的不一致性, CS 段允許執行和讀取,而 DS 、 ES 、 FS 和 SS 段的屬性則是可擴展和讀 / 寫訪問。另一個不明顯但十分重要的細節是 CS 、 FS 和 SS 段的 DPL 在用戶模式和內核模式并不相同。 DPL 是描述符特權級別( Descriptor Privilege Level )。對于代碼段( CS ),僅當調用者位于其 DPL 指定的特權級時才能調用該段中的代碼(參考 Intel 1999c, pp. 4-8f )。在用戶模式, CS 段的 DPL 為 3 ;在內核模式,其 DPL 為 0 。對于數據段( DS ),其 DPL 是最低的特權級,在用戶模式下,所有特權級都可訪問它,而在內核模式下,僅允許特權 0 訪問。

示列 4-13. 顯示 CPU 信息

IDT 和 GDT 寄存器的內容顯示了 GDT 的范圍是: 0x8003F000 --- 0x8003F3FF ,緊隨其后的就是 IDT ,其地址范圍是: 0x8003F400 --- 0x8003FBFF 。由于每個描述符占用 64 位,故 GDT 和 IDT 分別包含 128 和 256 個項。注意, GDT 可容納 8,192 個項,但 Windows 2000 僅使用了其中的一小部分。

表 4-5 代碼和數據段的 Type 屬性

CODE

c

使段一致(低特權的代碼可能進入)

CODE

r

允許讀訪問(和僅執行訪問相斥)

CODE

a

段可以訪問

DATA

e

向下擴展段(堆棧段的典型屬性)

DATA

w

允許寫訪問(和僅讀取訪問相斥)

DATA

a

段可以訪問

TSS32

a

任務狀態段可用

TSS32

b

任務狀態段繁忙

W2k_mem.exe 還提供了兩個很有特色的選項 ----+g 和 +i ,這兩個選項可顯示 GDT 和 IDT 的更多細節。 示列 4-14 示范了 +g 選項的輸出。它很類似于 示列 4-13 中的“ kernel-model segment: ”一節,但列出了在內核模式下所有可用的段選擇子( selector ),而不僅僅是存儲在段寄存器中的那些。 W2k_mem.exe 通過遍歷整個 GDT 來獲取所有的段選擇子,可通過 IOCTL 函數 SPY_IO_SEGMENT 來指示 Spy 設備查詢段信息。僅顯示有效的選擇子。比較 示列 4-13 4-14 中的 GDT 選擇子將十分有趣, GDT 的選擇子定義于 ntddk.h 中,匯總在 4-6 。顯然,它們與 w2k_mem.exe 的輸出是一致的。

示列 4-14. 顯示 GDT 描述符

表 4-6. 定義于 ntddk.h 中的 GDT 選擇子( selector )

KGDT_NULL

0x0000

空的段選擇子(無效)

KGDT_R0_CODE

0x0008

內核模式的 CS 寄存器

KGDT_R0_DATA

0x0010

內核模式的 SS 寄存器

KGDT_R3_CODE

0x0018

用戶模式的 CS 寄存器

KGDT_R3_DATA

0x0020

用戶模式的 DS 、 ES 和 SS 寄存器,內核模式的 DS 和 ES 寄存器

KGDT_TSS

0x0028

位于用戶和內核的任務狀態段

KGDT_R0_PCR

0x0030

內核模式的 FS 寄存器(處理器控制區域)

KGDT_R3_TEB

0x0038

用戶模式的 FS 寄存器(線程環境塊)

KGDT_VDM_TILE

0x0040

基地址 0x00000400 ,限制 0x0000FFFF ( Dos 虛擬機)

KGDT_LDT

0x0048

本地描述符表

KGDT_DF_TSS

0x0050

Ntoskrnl.exe 變量 KiDoubleFaultTSS

KGDT_NMI_TSS

0x0058

Ntoskrnl.exe 變量 KiNMITSS

示列 4-14 中的選擇子( selector )沒有在 4-6 中列出,其中的某些選擇子可以通過查找熟悉的基地址或其內存內容來確認它們。使用內核調試器可查找其中某些選擇子的基地址對應的符號。 4-7 給出了我已經確認的選擇子。

W2k_mem.exe 的 +i 選項可轉儲 IDT 中的門描述符( Gate Descriptor )。 示列 4-15 給出了 IDT 的門描述符的部分內容, Intel 僅定義了 IDT 中的前 20 個門描述符( Intel 1999c, pp. 5-6 )。 IDT 中的中斷 0x14 到 0x1F 由 Intel 保留;剩余的 0x20 到 0xFF 由操作系統使用。

4-8 中,我給出了所有可確認的特殊的中斷、陷阱和任務門。大多數用戶自定義的中斷都指向啞元例程 ---KiUnexpectedinterruptnNNN() ,在前面我們已經解釋過它。對于某些中斷處理例程的地址,內核調試器也無法解析其地址對應的符號。

表 4-7. 更多的 GDT 選擇子( selector )

基地址

0x0078

0x80400000

Ntoskrnl.exe 的代碼段

0x0080

0x80400000

Ntoskrnl.exe 的數據段

0x00A0

0x814985A8

TSS ( EIP 成員指向 HalpMcaExceptionHandlerWrapper )

0x00E0

0xF0430000

ROM BIOS 代碼段

0x00F0

0x8042DCE8

Ntoskrnl.exe 函數 KiI386CallAbios

0x0100

0xF0440000

ROM BIOS 數據段

0x0108

0xF0440000

ROM BIOS 數據段

0x0110

0xF0440000

ROM BIOS 數據段

示列 4-15. 顯示 IDT 門描述符

表 4-8. Windows 2000 中斷、陷阱和任務門

INT

Intel 定義的描述符

擁有者

處理例程 /TSS

0x00

整除錯誤( DE )

ntoskrnl.exe

KiTrap00

0x01

調試( DB )

ntoskrnl.exe

KiTrap01

0x02

NMI 中斷

ntoskrnl.exe

KiNMITSS

0x03

斷點( BP )

ntoskrnl.exe

KiTrap03

0x04

溢出( OF )

ntoskrnl.exe

KiTrap04

0x05

越界( BR )

ntoskrnl.exe

KiTrap05

0x06

未定義的操作碼( UD )

ntoskrnl.exe

KiTrap06

0x07

沒有數學協處理器( NM )

ntoskrnl.exe

KiTrap07

0x08

Double Fault ( DF )

ntoskrnl.exe

KiDouble

0x09

協處理器段溢出

ntoskrnl.exe

KiTrap09

0x0A

無效的 TSS ( TS )

ntoskrnl.exe

KiTrap0A

0x0B

段不存在( NP )

ntoskrnl.exe

KiTrap0B

0x0C

堆棧段故障( SS )

ntoskrnl.exe

KiTrap0C

0x0D

常規保護( GP )

ntoskrnl.exe

KiTrap0D

0x0E

頁故障( PF )

ntoskrnl.exe

KiTrap0E

0x0F

Intel 保留

ntoskrnl.exe

KiTrap0F

0x10

Math Fault ( MF )

ntoskrnl.exe

KiTrap10

0x11

對齊檢查( AC )

ntoskrnl.exe

KiTrap11

0x12

Machine Check ( MC )

?

0x13

流 SIMD 擴展

ntoskrnl.exe

KiTrap0F

0x14-0x1F

Intel 保留

ntoskrnl.exe

KiTrap0F

0x2A

用戶自定義

ntoskrnl.exe

KiGetTickCount

0x2B

用戶自定義

ntoskrnl.exe

KiCallbackReturn

0x2C

用戶自定義

ntoskrnl.exe

KiSetLowWaitHighThread

0x2D

用戶自定義

ntoskrnl.exe

KiDebugSerice

0x2E

用戶自定義

ntoskrnl.exe

KiSystemService

0x2F

用戶自定義

ntoskrnl.exe

KiTrap0F

0x30

用戶自定義

hal.dll

HalpClockInterrupt

0x38

用戶自定義

hal.dll

HalpProfileInterrupt

Windows 2000 的內存區域

W2k_mem.exe 的最后一個還未討論的選項是: +b 選項。該選項會產生 4GB 地址空間中相鄰內存區域的列表,這個列表非常大。 W2k_mem.exe 使用 Spy 設備的 IOCTL 函數 SPY_IO_PAGE_ENTRY 遍歷整個 PTE 數組(位于地址 0xC0000000 )來生成這個列表。在作為結果的每個 SPY_PAGE_ENTRY 結構中,通過將它們的 dSize 成員與其對應的 PTE 線性地址相加即可得到下一個 PTE 的地址。 列表 4-30 給出了該選項的實現方式。

DWord WINAPI DisplayMemoryBlocks (HANDLE hDevice)

{

SPY_PAGE_ENTRY spe;

PBYTE pbPage, pbBase;

DWORD dBlock, dPresent, dTotal;

DWORD n = 0;

pbPage = 0;

pbBase = INVALID_ADDRESS;

dBlock = 0;

dPresent = 0;

dTotal = 0;

n += _printf (L'rnContiguous memory blocks:'

L'rn-------------------------rnrn');

do {

if (!IoControl (hDevice, SPY_IO_PAGE_ENTRY,

&pbPage, PVOID_,

&spe, SPY_PAGE_ENTRY_))

{

n += _printf (L' !!! Device I/O error !!!rn');

break;

}

if (spe.fPresent)

{

dPresent += spe.dSize;

}

if (spe.pe.dValue)

{

dTotal += spe.dSize;

if (pbBase == INVALID_ADDRESS)

{

n += _printf (L'%5lu : 0x%08lX ->',

++dBlock, pbPage);

pbBase = pbPage;

}

}

else

{

if (pbBase != INVALID_ADDRESS)

{

n += _printf (L' 0x%08lX (0x%08lX bytes)rn',

pbPage-1, pbPage-pbBase);

pbBase = INVALID_ADDRESS;

}

}

}

while (pbPage += spe.dSize);

if (pbBase != INVALID_ADDRESS)

{

n += _printf (L'0x%08lXrn', pbPage-1);

}

n += _printf (L'rn'

L' Present bytes: 0x%08lXrn'

L' Total bytes: 0x%08lXrn',

dPresent, dTotal);

return n;

}

列表 4-30. 查找相鄰的線性內存塊

示列 4-16 摘錄了在我的機器上使用 +b 選項的輸出列表,可以看出其中的幾個區域非常有趣。一些非常明顯的地址是: 0x00400000 ,這是 w2k_mem.exe 內存映像的起始地址(第 13 號塊),還有一個是 0x10000000 ,此處是 w2k_lib.dll 的基地址(第 23 號塊)。 TEB 和 PEB 頁也很容易認出(第 104 號塊), hal.dll (第 105 號塊), ntoskrnl.exe (第 105 號塊), win32k.sys (第 106 號塊)。第 340---350 號塊是系統 PTE 數組的一小段,第 347 號塊是頁目錄的一部分。第 2122 號塊包含 SharedUserData 區域,第 2123 號塊由 KPCR 、 KPRCB 和包含線程和進程狀態信息的 CONTEXT 結構組成。

示列 4-16. 相鄰內存塊列表示列

還需要補充一下, W2k_mem.exe 的 +b 選項會報告有大量的內存被使用,這可能超出了一個合理的值(比如,你機器上的物理內存數)。請注意 示列 4-16 底部給出的匯總信息。我現在真的使用了 700MB 的內存嗎? Windows 2000 的任務管理器顯示是 150MB ,那么這兒的又是什么呢?這種奇特的效果都是由第 105 號內存塊產生的,該內存塊表示的范圍: 0x80000000----0xA01A5FFF 占用了 0x201A6000 字節,也就是說占用了 538,599,424 字節。這顯然是不可能的。問題是整個線性地址空間: 0x80000000 ---- 0x9FFFFFFF 都被映射到了物理內存: 0x00000000 ---- 0x1FFFFFFF ,在前面我已經提及過這一點。該區域中的所有 4MB 頁都對應地址 0xC0300000 處的頁目錄中的一個有效的 PDE ,我們可以使用 w2k_mem +d #0x200 0xC0300800 命令來證明這一點( 示列 4-17 )。因為結果列表中的所有 PDE 都是奇數( 譯注:如果 PDE 為奇數,證明其 P 位肯定為 1 ),所以它們對應的頁都必須存在;不過,它們并不需真正占用物理內存。事實上,這一內存區域的大部分都是“空洞( hole )”,如果將其復制到緩沖區中,可發現它們都被 0xFF 填充。因此,對于 w2k_mem.exe 輸出的內存使用情況,你不需要過于認真。

示列 4-17. 地址范圍是: 0x80000000 --- 0x9FFFFFFF 的 PDE

Windows 2000 的內存布局 本章的最后一部分將給出在一個 Windows 2000 進程“看”來, 4GB 線性地址空間的總體布局是什么樣子。 表 4-9 給出了多個基本數據結構的內存范圍。它們之間的“大洞( big hole )” 有不同的用途,如,用于進程模塊和設備驅動程序的加載區域,內存池,工作集鏈表等等。注意,有些內存地址和內存塊的大小在不同的系統之間有很大的差異,這 取決于物理內存和硬件的配置情況、進程的屬性以及其他一些系統變量。因此,這里給出的僅僅是一個草圖而已,并不是精確的布局圖。

有些物理內存塊在線性地址空間中出現的兩次或更多次。例如, SharedUserData 區域位于線性地址 0xFFDF0000 ,并且并鏡像到 0x7FFE0000 。這兩個地址都指向物理內存中的同一個頁,這意味著,如果向 0xFFDF0000+n 處寫入一個字節,那么 0x7FFE0000+n 處的值也會隨之改變。這是一個虛擬內存的世界 ---- 一個物理地址可以被映射到線性地址空間中的任何地方,即使一個物理地址在同一時間映射到多個線性地址也是可以的。回憶一下 4-3 4-4 ,它們清楚地展示了線性地址的這種“虛假行為”。它們的目錄和表位域正確的指向用來確定數據實際位置的結構體。如果兩個 PTE 的 PFN 恰好是相同的,那么它們對應的線性地址將指向物理內存相同位置。

表 4-9. 進程地址空間中的可確認的內存區域

起始地址

結束地址

十六進制大小

類型 / 描述

0x00000000

0x0000FFFF

10000

底部的受保護塊( Lower guard block )

0x00010000

0x0001FFFF

10000

WCHAR[]/ 環境字符串,在一個 4KB 頁中分配

0x00020000

0x0002FFFF

10000

PROCESS_PARAMETERS/ 在一個 4KB 頁中分配

0x00030000

0x0012FFFF

1000000

DWORD[4000]/ 進程堆棧(默認; 1MB )

0x7FFDD000

0x7FFDDFFF

1000

TEB/1# 線程的線程環境塊

0x7FFDE000

0x7FFDEFFF

1000

TEB/2# 線程的線程環境塊

0x7FFDF000

0x7FFDFFFF

1000

PEB/ 進程環境塊

0x7FFE0000

0x7FFE02D7

2D8

KUSER_SHARED_DATA/ 用戶模式下的 SharedUserData

0x7FFF0000

0x7FFFFFFF

10000

頂部的受保護塊( Upper guard block )

0x80000000

0x800003FF

400

IVT/ 中斷向量表

0x80036000

0x800363FF

400

KGDTENTRY[80]/ 全局描述符表

0x80036400

0x80036BFF

800

KIDTENTRY[100]/ 中斷描述符表

0x800C0000

0x800FFFFF

40000

VGA/ROM BIOS

0x80244000

0x802460AA

20AB

KTSS/ 內核任務狀態段(繁忙)

0x8046AB80

0x8046ABBF

40

KeServiceDescriptorTable

0x8046AB

0x8046ABFF

40

KeServiceDescriptorTableShadow

0x80470040

0x804700A7

68

KTSS/KiDoubleFaultTSS

0x804700A8

0x8047010F

68

KTSS/KiNMITSS

0x804704D8

0x804708B7

3E0

PROC[F8]/KiServiceTable

0x804708B8

0x804708BB

4

DWORD/KiServiceLimit

0x804708BC

0x804709B3

F8

BYTE[F8]/KiArgumentTable

0x814C6000

0x82CC5FFF

1800000

PFN[100000]/MmPfnDatabase (最大為 4GB )

0xA01859F0

0xA01863EB

9FC

PROC[27F]/W32pServiceTable

0xA0186670

0x A01863EE

27F

BYTE[27F]W32pArgumentTable

0xC0000000

0xC03FFFFF

400000

X86_PE[100000]/ 頁目錄和頁表

0xC1000000

0xE0FFFFFF

20000000

系統緩存( MmSystemCacheStart, MmSystemCacheEnd )

0xE1000000

0xE77FFFFF

6800000

頁池( Paged Pool )( MmPagedPoolStart, MmPagedPoolEnd )

0xF0430000

0xF043FFFF

10000

ROM BIOS 代碼段

0xF0440000

0xF044FFFF

10000

ROM BIOS 數據段

0xFFDF0000

0xFFDF02D7

2D8

KUSER_SHARED_DATA/ 內核模式下的 SharedUserData

0xFFDFF000

0xFFDFF053

54

KPCR/ 處理器控制區(內核模式 FS 段)

0xFFDFF120

0xFFDFF13B

1C

KPRCB/ 處理器控制塊

0xFFDFF13C

0xFFDFF407

2CC

CONTEXT/ 線程 CONTEXT ( CPU 狀態)

0xFFDFF620

0xFFDFF71F

100

后備鏈表目錄( Lookaside list DirectorIEs )

標簽: Windows系統
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久视频国产| 亚洲精品在线二区| 伊人久久成人| 成人看片网站| 黄在线观看免费网站ktv| 国产伦一区二区三区| 亚洲精品综合| 日韩中文字幕1| 欧美 日韩 国产一区二区在线视频 | 日韩视频一二区| 久久激情婷婷| 福利一区在线| 久久精品天堂| 欧美亚洲tv| 欧美亚洲tv| 久久狠狠久久| 青草av.久久免费一区| 综合激情五月婷婷| 亚洲制服少妇| 亚洲一区二区动漫| 亚洲一区观看| 免费精品视频最新在线| 丝袜亚洲精品中文字幕一区| 亚洲五月婷婷| 久久久久国产精品一区三寸| 日韩深夜视频| 丝袜av一区| 香蕉久久99| 91精品婷婷色在线观看| 欧美日韩国产免费观看| 免费精品视频| 蜜桃久久av| 亚洲欧洲专区| 欧美久久精品| 麻豆高清免费国产一区| 麻豆国产精品| 综合日韩av| 久久中文字幕一区二区三区| 国产乱子精品一区二区在线观看 | 91亚洲国产| 日韩av专区| 日韩精品第一区| 精品成人免费一区二区在线播放| 91tv亚洲精品香蕉国产一区| 米奇777超碰欧美日韩亚洲| 合欧美一区二区三区| 伊人久久亚洲美女图片| 免费观看在线色综合| 日韩福利在线观看| 亚洲人成网77777色在线播放| 中文字幕av一区二区三区人| 日韩av一区二区三区| 欧美日韩99| 91中文字幕精品永久在线| 欧美 日韩 国产精品免费观看| 亚洲免费一区二区| 日韩在线观看中文字幕| 国产精品高清一区二区| 成人国产精选| 欧美日韩精品免费观看视频完整| 亚洲青青久久| 精品三区视频| 亚洲国产一区二区在线观看| 美美哒免费高清在线观看视频一区二区| 亚洲区国产区| 久久精品国产99国产| 欧美/亚洲一区| 一区二区三区四区在线观看国产日韩 | 免费精品国产的网站免费观看| 欧美一级专区| 国产精品白浆| 欧美a级一区| 日韩av中文字幕一区| 精品欧美日韩精品| 午夜久久一区| 日韩在线观看中文字幕| 首页国产精品| 丝袜美腿一区二区三区| 久久久久久久久成人| 久久久久欧美精品| 亚洲欧美久久久| 麻豆视频久久| 先锋影音国产一区| 国产精品99一区二区三| 日韩精品一二三四| 国产精品久久观看| 三级在线观看一区二区| 精品一区二区三区四区五区| 日韩视频不卡| 精品福利久久久| 午夜一区在线| 国产精品久久| 亚洲一区网站| 国产色播av在线| 久久福利一区| 鲁大师精品99久久久| 午夜在线播放视频欧美| 国产精品巨作av| 在线视频观看日韩| 国产精品毛片久久久| 奶水喷射视频一区| 欧美成人a交片免费看| 日韩一区二区三免费高清在线观看 | 99精品小视频| 青草综合视频| 激情综合在线| 风间由美中文字幕在线看视频国产欧美| 一本一本久久| 伊人久久国产| 国产精品一区二区三区www| 欧美在线资源| 国产不卡一区| 日韩不卡在线观看日韩不卡视频| 婷婷综合六月| 精品国产一区二区三区噜噜噜| av不卡在线| 正在播放日韩精品| 国产精品久久久久久模特 | 亚洲欧洲一区二区天堂久久| 国产69精品久久| 日韩中文字幕在线一区| 国产精品99免费看| 成人国产精品一区二区网站| 日韩**一区毛片| 亚洲欧洲午夜| 亚洲高清成人| 中国字幕a在线看韩国电影| 欧美日韩一区二区综合| 福利在线免费视频| 久久av网站| 日本欧美一区二区| 性色av一区二区怡红| 在线手机中文字幕| 国产精品入口久久| 日韩精选在线| 一区二区国产精品| 日韩视频一区二区三区在线播放免费观看 | 一区免费视频| 成人日韩av| 免费一级欧美在线观看视频| 欧美午夜不卡| 视频一区二区三区在线| 亚洲理论在线| 欧美69视频| 亚洲风情在线资源| 国产免费av一区二区三区| 日韩精品中文字幕第1页| 国产欧美日韩一区二区三区四区| 国产欧美日韩一区二区三区四区| 日韩va亚洲va欧美va久久| 国产精品一级| 97精品国产福利一区二区三区| av在线最新| 蜜桃av.网站在线观看| 日韩高清中文字幕一区二区| 不卡中文字幕| 中文在线日韩| 久久不见久久见免费视频7| 国产自产自拍视频在线观看| 日韩天堂av| 日本成人中文字幕在线视频| 久久不见久久见免费视频7| 中文在线а√天堂| 婷婷亚洲五月色综合| 日韩动漫一区| 精品高清久久| 欧美日韩激情在线一区二区三区| 亚洲一区二区免费看| 日韩成人精品一区二区三区| 国产精品亚洲欧美一级在线| 97国产成人高清在线观看| 日韩视频精品在线观看| 欧美日韩一区二区三区四区在线观看 | 老色鬼精品视频在线观看播放| а√在线中文在线新版| 性欧美长视频| 国产精品香蕉| 999久久久免费精品国产| 日韩免费精品| 激情国产在线| 亚洲精品大片| 国产va在线视频| 亚洲免费网址| 美日韩一区二区三区| 91精品99| 国产精品一区二区三区美女| 久久久天天操| 日韩av在线免费观看不卡| 欧美精品日日操| 亚洲精品麻豆| 91亚洲一区| 亚洲永久精品唐人导航网址| 国产一区福利| 免费观看在线综合| 日本а中文在线天堂| 日韩精品欧美大片| 日韩精品影视| 欧美日韩亚洲一区三区| 激情欧美国产欧美| 国产精品免费精品自在线观看|