Win32彙編學習——windows基礎知識(小甲魚教程)

《Win32彙編語言程序設計》(小甲魚)

 

1)windows特權保護機制

1)80386的中斷和異常

2)80386的保護機制

3)Windows的保護機制

2)80x86處理器的工作模式

1.實模式

2.保護模式

3.虛擬8086模式

3)Win7的啓動過程

1.開啓電源,加電自檢(在主板上的一個BIOS芯片)

 檢查完之後(檢查一些硬盤,磁盤、CPU...看能不能通電),BIOS會讀取主引導記錄(MBR)。

MBR:是我們的存儲區,位於我們硬盤的第一個扇區—硬盤讀取的第一個位置,裏面有系統加載信息以及各個分區的信息、狀態和偏移地址。大小爲512字節,可以分爲兩個部分——第一部分pre-boot區(預啓動區),佔446字節,記錄着第二部分的內容。  第二部分是Partition table區(分區表),佔66個字節,作用是判斷哪個分區被標記爲活動分區,然後去讀取那個分區的啓動區,並運行該區中的代碼。 最後兩個字節“55 AA”是標誌位,標誌着是正常的MBR。

MBR不屬於任何一個操作系統,也不能用操作系統提供的磁盤操作命令來讀取它,但可以用ROM-BIOS中提供的INT 13H中斷的2號功能讀取該扇區的內容。

Ps: 病毒元老級人物——引導性病毒,經常利用修改MBR裏的記錄,使病毒在系統加載之前被加載。例如鬼影病毒

2.啓動菜單生成

Windows啓動管理器讀取“啓動配置數據存儲”中的信息——所有操作系統的配置信息(可自己配置)

   當選擇的是進入Windows 7系統,windows啓動管理器運行%SystemRoot%\System32文件夾中的OS loaderWinload.exe。這個時候還是黑屏。。。

   當選擇的是自休眠狀態恢復Windows7,那將會運行Winresume.exe先恢復先前的程序。

    當選擇的是早期的Windows版本,啓動管理器將加載Windows NT風格的早期OS loader(Ntlder.exe)——生成一個由boot.ini內容決定的啓動菜單。

3.核心文件加載及登錄

Windows7啓動時,加載其核心文件Ntoskrnl.exe 和 hal.dll —— 從註冊表中讀取設置並加載驅動程序。接下來將運行Windows會話管理器(smss.exe)並且啓動Windows啓動程序(Wininit.exe)本地安全驗證(Lsass.exe)與服務(services.exe)進程,完成後,就可以登錄系統了。

4.繪製桌面

4)實模式

1)處理器被複位或者加電的時候以實模式啓動。

2)80386處理器在實模式下的存儲器尋址方式和8086一樣,但不能對內存進行分頁管理,所以指令尋址的地址就是內存中實際的物理地址。在實模式下,所有的段都是可讀、寫和執行的。同時它不支持優先級,所有的指令相當於工作在特權極,所以可以執行所有特權指令,包括讀寫控制寄存器CRO等。

3)實際上,80386就是通過在實模式下 初始化控制寄存器,例GDTR、LDTR、IDTR與TR等管理寄存器以及頁表,然後加載CRO使其中的保護模式

 

5)所有保護模式的特性在實模式下都是不可行的,保護模式一定要從實模式進入

 

6)中斷處理方式

   實模式下的中斷處理方式和8086處理器相同,也用中斷向量表來定位中斷服務程序地址。中斷向量表的結構也和8086處理器一樣:每4個字節組成一箇中斷向量,其中包括兩個字節的段地址和兩個字節的偏移地址

 

7)80386 於 8086 的好處

   寄存器是32位的

   增加了兩個輔助段寄存器FS和GS

 

8)保護模式

這時,80386所有功能都是可用的。這時80386所有的32根地址線都可尋址,物理尋址空間高達4GB。

①支持內存分頁機制,提供了對虛擬內存的良好支持。

②支持多任務,可以依靠硬件僅在一條指令中實現任務切換。任務環境的保護工作是由CPU處理器自動完成的,物理上完成的,物理加速是最快的,因爲它不考慮兼容。

③支持優先級機制,不同的程序可以運行在不同的優先級上。 1和2沒有用上,0、3和4有。。。

 

9)從實模式切換到保護模式是通過修改控制寄存器CRO的控制位PE(位0)實現的。在這之前還需要建立保護模式必須的一些數據表,如全局描述符表GDT和中斷描述表IDT。

 

DOS操作系統運行在實模式下,而Windows操作系統運行於保護模式下。。。所以想從Windows進入DOS是不可能的,要重開機加載DOS系統,要改MBR中某個區塊的索引信息指向了DOS系統。

 

10)虛擬8086模式

①以任務形式在保護模式上執行的,在80386上可以同時支持由多個真正的80386任務和虛擬86模式構成的任務。

②在Windows操作系統中,有一部分程序專門用來管理虛擬86模式的任務,稱爲虛擬86管理程序。

③工作模式是實模式與保護模式的混合。

④與8086尋址方式一樣,空間爲1MB。

⑤多個虛擬86任務不能同時使用同一位置的1MB地址空間

⑥8086代碼有相當一部分指令在保護模式下屬於特權指令,如屏蔽中斷的cli和中斷返回指令iret(可能會威脅到保護模式)。爲了解決這個問題,虛擬86管理程序採用模擬的方法來完成這些指令。  虛擬86管理程序在異常處理程序中檢查產生異常的指令,如果是中斷指令,則從虛擬86任務的中斷向量表中取出中斷處理程序的入口地址,並將控制轉移過去。如果是危及操作系統的指令,如cli等,則簡單地忽略這些指令,在異常處理程序返回的時候直接返回到下一條指令。

 

11)內存管理機制

DOS操作系統的內存使用——

①系統硬件使用的存儲器地址被安排在高端(高地址)

②從A0000h開始的384kb中,用於顯示的視頻緩衝區和BIOS數據區;剩下從500h開始到A0000h總共不到640kb的內存是操作系統和應用程序所能使用的,應用程序不可能使用這640kb以外的內存,這就是著名的“640kb限制”

③如果系統中有內存駐留程序(TSR)存在,那麼應用程序還要和這些TSR程序共同分享這段內容空間。

在80386中很少見到段寄存器——是因爲32位的通用寄存器可以訪問4GB的空間,所以不需要段地址了,偏移地址就夠了。但是段寄存還是再使用着的。因爲涉及屬性和保護模式下段的其它參數,要表示的信息太多了,64位長的數據才能表示,這64位的屬性數據叫做段描述符。(用戶不需要關心段寄存器的值,已經指向正確的描述符)

又:80386的段寄存器是16位(放不下64位),所以把所有段的段描述符順序放在內存中的指定位置,組成一個段描述符表。而段寄存器中的16位用來做索引信息(稱之爲段選擇器),指定這個段的屬性用段描述符表中的第幾個描述符來表示。實際上只有高13位表示索引值,剩下的3位第0,1位表示程序的當前優先級,第2位(TI位)用來表示在段描述符的位置,0表示在GDT中,1表示在LDT中。   

80386中引入了兩個新的寄存器來管理段描述符表:一個是48位的全局描述符表寄存器GDTR(整個系統只有一個),一個是16位的局部描述符表寄存器LDTR(每個任務都有,放在不同內存段,又將這些描述這些描述符當作系統描述符放在全局描述符表中)。

GDTR直接指向內存地址,LDTR和CS,DS等段選擇器只存放索引值

Ps:每個應用程序拿到的都是虛擬地址,經過轉換器,纔得到物理地址

 

80386內存尋址機制—— 解決多任務操作系統中碎片內存合併。

1)80386處理器把4KB大小的一塊內存當做“一頁”內存,每頁內存可以根據“頁目錄”和“頁表”,隨意映射到不同的線性地址上(像C++的鏈表一樣)。

2)在80386處理器中,除了和CR3寄存器(指定當前頁目錄的地址)相關的指令使用的是物理地址外,其它所有指令都是用線性地址尋址的

3)內存分頁機制是由80386處理器新增的CRO寄存器中的位31(PG位)決定的。 PG==0,分頁機制不啓用,這時所有指令尋址的地址(線性地址)就是系統中實際的物理地址,和8086一樣。 PG==1,80386處理器進入內存分頁管理模式,所有的線性地址要經過頁表的映射纔得到最後的物理地址。

4)內存分頁管理只能在保護模式下纔可以實現,實模式不支持分頁機制。但不管在哪種模式下,所有尋址指令使用的都是線性地址。 PG==0時,也是線性地址,只不過此時的線性地址就是實際的物理地址。

5)頁表規定的不僅是地址的映射,同時還規定了頁的訪問屬性(只讀、可讀)。Windows的保護機制就建立在這之上

 

線性地址與物理地址

儘管線性空間的大小和物理內存的大小之間沒有任何關係,但使用線性空間的應用程序最終還是要運行在物理內存中。應用所給出的任何線性地址最終必須被轉化爲物理地址,才能夠真正的訪問物理內存。所以,線性內存空間必須被映射到物理內存空間中,這個映射關係需要通過使用硬件體系結構所規定的數據結構來建立

 

11)Windows的內存安排

1)每個應用程序都有自己的4GB的尋址空間,就算這個程序只佔1kb的內存。

2)不同應用程序的線性地址空間是隔離的,儘管他們在內存中是混亂在一起的。

3)DLL程序是沒有自己私有的空間。插在其它程序裏面,它們總是被映射到其它應用程序的地址空間中,當做其它應用程序的一部分運行。

4)虛擬內存安排,Windows系統一般在硬盤上建立大小爲物理內存兩倍左右的交換文件用作虛擬內存。利用80386處理器的內存分頁機制,交換文件的尋址,只需要在真正調用的時候將其讀入物理內存並同時修改線性地址映射到這塊內存即可。

5)CPU只能看到線性地址,在調用一個程序的時間片中,和這個程序執行無關的部分,並不會映射到線性地址中。

 

12)Windows的特權保護

1)  Windows的特權保護和處理器硬件的支持是分 不開的。

2)優先級的劃分、指令的權限檢查和超出權限訪問的異常處理等是構成特權保護的基礎

 

Win32彙編中爲什麼找不到中斷指令的應用?

     保護模式下,中斷或異常處理往往從用戶代碼切換到操作系統代碼中執行。由於保護模式下的代碼有優先級之分,因此出現了從優先級低的應用程序轉移到優先級高的系統代碼中的問題,優先級低的不能調用高的。
80386共設置4個優先級(0~3)
    0級是最高的(特權極)3級是最低級(用戶級)

    爲了使低優先級安全的調用高優先級,保護模式增加了“門”的概念。 “門”指向某一個優先級高的程序所規定的入口點,所有優先級低的程序調用優先級高的程序只能通過門重定向,避免了低級別的程序從任意位置進入優先級高的程序的問題。
    保護模式下的中斷和異常等服務程序也要從“門”進入,80386的門分爲中斷門、自陷門和任務門。。。

    在Windows中,操作系統使用動態鏈接庫來代替中斷服務程序提供系統功能,所以Win32彙編中int指令也就失去了存在的意義。其實那些調用API的指令 原本是用int指令實現的。(暗中調用)

Windows錯誤藍屏怎麼產生?

    程序違反了Windows規定的“保護條例”,引發了保護異常。
保護條例——段的類型檢查、頁的類型檢查、訪問數據時的級別檢查、控制轉移的檢查、指令集的檢查、I/O操作的保護

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章