欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

操作系統(tǒng)--實(shí)模式到保護(hù)模式

? ??操作系統(tǒng)--實(shí)模式到保護(hù)模式

創(chuàng)新互聯(lián)建站基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶(hù)提供專(zhuān)業(yè)光華機(jī)房服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性?xún)r(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專(zhuān)業(yè)成都idc公司。

一.實(shí)模式到保護(hù)模式(上)

????A.在這里需要從計(jì)算機(jī)的歷史談起

????1.遠(yuǎn)古時(shí)期的程序開(kāi)發(fā):是直接操作物理內(nèi)存

????2.CPU指令的操作數(shù)直接使用實(shí)地址(實(shí)際的內(nèi)存地址)

????3.程序員擁有絕對(duì)的權(quán)力(利用cpu指哪打哪)

????在當(dāng)時(shí)的實(shí)模式所擁有的權(quán)力帶來(lái)了許多的問(wèn)題-難以定位的問(wèn)題,主要因?yàn)槌绦蛎看味夹枰瑯拥刂返膬?nèi)存執(zhí)行;同時(shí)還會(huì)帶來(lái)給多道程序設(shè)計(jì)帶來(lái)障礙的問(wèn)題,主要是因?yàn)椴还軆?nèi)存多大,只要有一個(gè)字節(jié)被其它程序占用都無(wú)法執(zhí)行

????B.為了解決上述的問(wèn)題就有了這款CPU歷史的里程碑-8086

????1.地址寬度為20位,可訪問(wèn)1M內(nèi)存空間

????2.引入[段地址:偏移地址]的內(nèi)存訪問(wèn)方式-8086的段寄存器和通用寄存器位16位,單個(gè)寄存器尋址最多訪問(wèn)64K的內(nèi)存空間,需要兩個(gè)寄存器配合,完成所有內(nèi)存空間的訪問(wèn)

段地址:偏移地址--這兩個(gè)的使用與定義有兩方面的意義

????1.硬件所做的工作--段地址左移4位,構(gòu)成20位的基地址(起始地址),同時(shí)實(shí)地址=基地址+偏移地址

????2.對(duì)于開(kāi)發(fā)者的意義--可以更有效的劃分內(nèi)存的功能(數(shù)據(jù)段,代碼段等),同時(shí)當(dāng)程序地址沖突時(shí),通過(guò)修改段地址解決沖突

????操作系統(tǒng)--實(shí)模式到保護(hù)模式

8086的詳細(xì)介紹https://baike.baidu.com/item/8086/7716347?fr=aladdin

????Q:由8086會(huì)引出一個(gè)問(wèn)題-段地址:偏移地址能訪問(wèn)的最大地址位0xFFFF:0xFFFF,即10FFEF;超過(guò)了1MB的空間,CPU該如何處理?

????我們知道8086的高端地址區(qū)

????操作系統(tǒng)--實(shí)模式到保護(hù)模式

????所以8086的處理方式-由于8086只有20位地址線,因此最高位被丟棄

????操作系統(tǒng)--實(shí)模式到保護(hù)模式

所以8086時(shí)期應(yīng)用程序中的問(wèn)題

????1.1MB內(nèi)存完全不夠用-內(nèi)存在任何時(shí)期都不夠用

????2.開(kāi)發(fā)者在程序中大量使用內(nèi)存回卷技術(shù)-HMA地址被使用

????3.應(yīng)用程序之間沒(méi)有界限,相互之間隨意干擾-A程序可以隨意訪問(wèn)B程序中的數(shù)據(jù),C程序可以修改系統(tǒng)調(diào)度程序的指令

????所以80286出現(xiàn)--8086已經(jīng)沒(méi)有那么多應(yīng)用程序,所以必須兼容再兼容,加大內(nèi)存容量,增加地址線數(shù)量(24位),[段地址:偏移地址]的方式可以強(qiáng)化一下,可以為每個(gè)段提供更多屬性(如:范圍,特權(quán)級(jí)等),可以為每個(gè)段的定義提供固定方式;80286在默認(rèn)情況下完全兼容8086的運(yùn)行方式(實(shí)模式),它默認(rèn)可直接訪問(wèn)1MB的內(nèi)存空間,但是通過(guò)特殊的方式訪問(wèn)1MB+的空間

操作系統(tǒng)--實(shí)模式到保護(hù)模式

C.保護(hù)模式

????1.每一段內(nèi)存都擁有一個(gè)屬性定義(描述符)

????2.所有段的屬性定義構(gòu)成一張表(描述符表)

????3.段寄存器保存的是屬性定義在表中的索引(選擇子)

描述符的內(nèi)存結(jié)構(gòu)

操作系統(tǒng)--實(shí)模式到保護(hù)模式

?描述符表

操作系統(tǒng)--實(shí)模式到保護(hù)模式

選擇子的結(jié)構(gòu)

操作系統(tǒng)--實(shí)模式到保護(hù)模式

????進(jìn)入保護(hù)模式的方式--1.定義描述符表2.打開(kāi)A20地址線3.加載描述表4.通知CPU進(jìn)入保護(hù)模式

小結(jié)

????1.[段地址:偏移地址]的尋址方式解決了早期程序重定位難得問(wèn)題

????2.8086實(shí)模式下的程序無(wú)法保證安全性

????3.80286中提出了保護(hù)模式,加強(qiáng)了內(nèi)存段的安全性

????4.處于兼容的考慮,80286之后的處理器都有2種工作模式

????5.處理器需要特定的設(shè)置步驟才能進(jìn)入保護(hù)模式,默認(rèn)為實(shí)模式

二.實(shí)模式到保護(hù)模式(中)

????????80286的出現(xiàn)引入了保護(hù)模式,為現(xiàn)代操作系統(tǒng)和應(yīng)用程序奠定了基礎(chǔ),但是在設(shè)計(jì)方面還是有缺陷的-體現(xiàn)在段寄存器為24位,通用寄存器為16為,理論上段寄存器中的數(shù)值可以直接作為段基址,16位通用寄存器最多訪問(wèn)64K的內(nèi)存,為了訪問(wèn)16M的內(nèi)存,必須不停切換段基址

????A.80386(由于80286的不足,出現(xiàn)了改進(jìn)版80386)

????1.32位地址總線,可支持4G的內(nèi)存空間

????2.段寄存器和通用寄存器位32位

????3.任何一個(gè)寄存器都能訪問(wèn)到內(nèi)存的任意角落--開(kāi)啟了平坦內(nèi)存模式的新時(shí)代,段基址為0,使用通用寄存器訪問(wèn)4G內(nèi)存空間

????新時(shí)期的內(nèi)存使用方式有三種

????1.實(shí)模式-兼容8086的內(nèi)存使用方式

????2.分段模式-通過(guò)[段地址:偏移地址]的方式將內(nèi)存從功能上分段(數(shù)據(jù)段,代碼段)

????3.平坦模式-所有內(nèi)存就是一個(gè)段[0:32位偏移地址]

段屬性定義

操作系統(tǒng)--實(shí)模式到保護(hù)模式

選擇子屬性定義

操作系統(tǒng)--實(shí)模式到保護(hù)模式

保護(hù)模式中的段定義

操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

匯編小貼士

????section關(guān)鍵字用于"邏輯的"定義一段代碼集合

????section定義的代碼段不同于[段地址:偏移地址]的代碼段

????section定義的代碼段僅限于源碼中的代碼段

????[段地址:偏移地址]的代碼段指內(nèi)存中的代碼段

操作系統(tǒng)--實(shí)模式到保護(hù)模式

????bits16-用于指示編譯器將代碼按照16位方式進(jìn)行編譯

????bits32-用于指示編譯器將代碼按照32位方式進(jìn)行編譯

在這里我們需要注意的是

????1.段描述表中的第0個(gè)描述符不使用

????2.代碼中必須顯示的指明16位代碼段和32位代碼段

????3.必須使用jmp指令從16位代碼段跳轉(zhuǎn)到32位代碼段

保護(hù)模式的編程實(shí)驗(yàn)--實(shí)驗(yàn)的原材料需要inc.asm同時(shí)需要將loader.asm進(jìn)行修改、

loader.asm修改如下

%include?"inc.asm"
org?0x9000

jmp?CODE16_SEGMENT

[section?.gdt]

;?GDT?definition



GDT_ENTRY???????:?????Descriptor????0,????????????0,???????????0

CODE32_DESC?????:?????Descriptor????0,????Code32SegLen??-?1,???DA_C?+?DA_32

;?GDT?end



GdtLen????equ???$?-?GDT_ENTRY



GdtPtr:

??????????dw???GdtLen?-?1

??????????dd???0
?????????????????

;?GDT?Selector


Code32Selector????equ?(0x0001?<<?3)?+?SA_TIG?+?SA_RPL0


;?end?of?[section?.gdt]


[section?.s16]

[bits?16]

CODE16_SEGMENT:

????mov?ax,?cs

????mov?ds,?ax

????mov?es,?ax

????mov?ss,?ax

????mov?sp,?0x7c00

????
????;?initialize?GDT?for?32?bits?code?segment

????mov?eax,?0

????mov?ax,?cs

????shl?eax,?4

????add?eax,?CODE32_SEGMENT

????mov?word?[CODE32_DESC?+?2],?ax

????shr?eax,?16

????mov?byte?[CODE32_DESC?+?4],?al

????mov?byte?[CODE32_DESC?+?7],?ah

????
????;?initialize?GDT?pointer?struct

????mov?eax,?0

????mov?ax,?ds

????shl?eax,?4

????add?eax,?GDT_ENTRY

????mov?dword?[GdtPtr?+?2],?eax


????;?1.?load?GDT

????lgdt?[GdtPtr]

????
????;?2.?close?interrupt

????cli?

????
????;?3.?open?A20

????in?al,?0x92

????or?al,?00000010b

????out?0x92,?al

????
????;?4.?enter?protect?mode

????mov?eax,?cr0

????or?eax,?0x01

????mov?cr0,?eax

????
????;?5.?jump?to?32?bits?code

????jmp?dword?Code32Selector?:?0


[section?.s32]

[bits?32]

CODE32_SEGMENT:

????mov?eax,?0

????jmp?CODE32_SEGMENT


Code32SegLen????equ????$?-?CODE32_SEGMENT

make以及inc.asm

;?Segment?Attribute
DA_32????equ????0x4000
DA_DR????equ????0x90
DA_DRW???equ????0x92
DA_DRWA??equ????0x93
DA_C?????equ????0x98
DA_CR????equ????0x9A
DA_CCO???equ????0x9C
DA_CCOR??equ????0x9E

;?Selector?Attribute
SA_RPL0????equ????0
SA_RPL1????equ????1
SA_RPL2????equ????2
SA_RPL3????equ????3

SA_TIG????equ????0
SA_TIL????equ????4

;?描述符
;?usage:?Descriptor?Base,?Limit,?Attr
;????????Base:??dd
;????????Limit:?dd?(low?20?bits?available)
;????????Attr:??dw?(lower?4?bits?of?higher?byte?are?always?0)
%macro?Descriptor?3	??????????????????????????;?段基址,?段界限,?段屬性
????dw????%2?&?0xFFFF?????????????????????????;?段界限1
????dw????%1?&?0xFFFF?????????????????????????;?段基址1
????db????(%1?>>?16)?&?0xFF???????????????????;?段基址2
????dw????((%2?>>?8)?&?0xF00)?|?(%3?&?0xF0FF)?;?屬性1?+?段界限2?+?屬性2
????db????(%1?>>?24)?&?0xFF???????????????????;?段基址3
%endmacro?????????????????????????????????????;?共?8?字節(jié)

make的依賴(lài)需要修改操作系統(tǒng)--實(shí)模式到保護(hù)模式

準(zhǔn)備工作之后make,bochs之后看結(jié)果

操作系統(tǒng)--實(shí)模式到保護(hù)模式

????發(fā)現(xiàn)在bochs下并沒(méi)有打印結(jié)果所以需要設(shè)置斷點(diǎn)來(lái)對(duì)該實(shí)驗(yàn)進(jìn)行繼續(xù)驗(yàn)證,首先對(duì)loader.asm進(jìn)行反編譯得到如圖左邊的結(jié)果,發(fā)現(xiàn)箭頭對(duì)應(yīng)處為loader.asm也就是右圖箭頭所對(duì)應(yīng)處

操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

可以在左邊對(duì)應(yīng)點(diǎn)地址處設(shè)置斷點(diǎn)來(lái)對(duì)結(jié)果進(jìn)行分析,結(jié)果如下

操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

????從右邊的結(jié)果可以得出,進(jìn)行以此跳轉(zhuǎn)之后再進(jìn)行賦值,為了實(shí)驗(yàn),多次進(jìn)行單步操作,發(fā)現(xiàn)得出的結(jié)果是一致的,意味著死循環(huán)了,這樣我們就從實(shí)模式到了保護(hù)模式,從16位代碼段進(jìn)入到32位代碼段進(jìn)行執(zhí)行。

????我們?cè)谏厦娴拇a中為什么不直接使用標(biāo)簽定義描述符中的段基地址?為什么 16 位代碼段到 32 位代碼段必須無(wú)條件跳轉(zhuǎn)呢?那么在匯編中,NASM 將匯編文件當(dāng)成一個(gè)獨(dú)立的代碼段進(jìn)行編譯,匯編代碼中的標(biāo)簽(Label)代表的是段內(nèi)偏移地址,實(shí)模式下需要配合段寄存器中的值計(jì)算標(biāo)簽的物理地址,這便是我們不直接使用標(biāo)簽定義描述符中的段基地址的原因了。代碼跳轉(zhuǎn)則是由于在匯編中存在一個(gè)流水線技術(shù)的概念。什么是流水線技術(shù)呢?處理器為了提高效率將當(dāng)前指令和后續(xù)指令預(yù)取到流水線,因此,可能同時(shí)預(yù)期的指令中既有 16 位代碼又有 32 位代碼。為了避免將 32 位代碼用 16 位代碼的方式運(yùn)行,需要刷新流水線,此時(shí)便需要使用無(wú)條件跳轉(zhuǎn) jmp 技術(shù)才能強(qiáng)制刷新流水線。

小結(jié)

????1.80386處理器是計(jì)算機(jī)發(fā)展史上的里程碑

????2.32位的寄存器和地址總線能夠直接訪問(wèn)4G內(nèi)存的任意角落

????3.需要在16位實(shí)模式中對(duì)GDT中的數(shù)據(jù)進(jìn)行初始化

????4.代碼中需要位GDT定義一個(gè)標(biāo)識(shí)數(shù)據(jù)結(jié)構(gòu)

????5.需要使用jmp指令從16位代碼跳轉(zhuǎn)到32位代碼

三.實(shí)模式到保護(hù)模式(下)

????在上面的實(shí)驗(yàn)中,我們注意到使用了jmp dword Code32Selector :0,為什么需要dword,要知道在這里的jmp的作用(s16-s32)-在16位代碼中,所有的立即數(shù)默認(rèn)為16位,從16位代碼段跳轉(zhuǎn)到32位代碼時(shí),必須做強(qiáng)制轉(zhuǎn)換,否則,段內(nèi)偏移地址可能被截?cái)?/p>

操作系統(tǒng)--實(shí)模式到保護(hù)模式

????在這節(jié)需要深入保護(hù)模式:定義顯存段,為了顯示數(shù)據(jù),必須存在兩大硬件:顯卡+顯示器。顯卡是為顯示器提供需要顯示的數(shù)據(jù),控制顯示器的模式和狀態(tài)。而顯示器是將目標(biāo)數(shù)據(jù)以可見(jiàn)的方式呈現(xiàn)在屏幕上。顯存的概念和意義就是顯卡擁有自己內(nèi)部的而數(shù)據(jù)存儲(chǔ)器,顯存在本質(zhì)上和普通內(nèi)存無(wú)差別,用于存儲(chǔ)目標(biāo)數(shù)據(jù),操作顯存中的數(shù)據(jù)將導(dǎo)致顯示器上內(nèi)容的改變。

????顯卡的工作模式有兩種-文本模式與圖形模式。在不同的模式下,顯卡對(duì)顯存內(nèi)容的解釋是不同的,可以使用專(zhuān)屬指令或int 0x10中斷改變顯卡工作模式,在文本模式下的顯存的地址范圍映射位[0xB8000,0xBFFFF],一屏幕可以顯示25行,每行80個(gè)字符

????顯卡的文本顯示原理與文本模式下顯示字符

操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

????對(duì)段基址和段屬性進(jìn)行設(shè)置之后以及打印的結(jié)果,發(fā)現(xiàn)會(huì)在bochs上打印出結(jié)果p

操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

????在實(shí)現(xiàn)完單個(gè)字符的打印之后,可以進(jìn)一步實(shí)現(xiàn)指定內(nèi)存中的字符串打印,首先需要準(zhǔn)備的工作有定義全局堆棧段(.gs),用于保護(hù)模式下的函數(shù)調(diào)用,之后定義全局?jǐn)?shù)據(jù)段(.dat),用于定義只讀數(shù)據(jù),最后利用對(duì)顯存段的操作定義字符串打印函數(shù)

????打印函數(shù)的設(shè)計(jì)可以如下圖所示

????操作系統(tǒng)--實(shí)模式到保護(hù)模式

????在這里需要注意的是32位保護(hù)模式下的乘法操作是被乘數(shù)放到AX寄存器,乘數(shù)放到通用寄存器或內(nèi)存單元(16位),相乘的結(jié)果放在EAX寄存器中;同時(shí)$表示當(dāng)前行相對(duì)于代碼起始位置處的偏移量,$$表示當(dāng)前代碼節(jié)的起始位置

操作系統(tǒng)--實(shí)模式到保護(hù)模式

????實(shí)現(xiàn)過(guò)程以及實(shí)現(xiàn)結(jié)果,可以看到實(shí)現(xiàn)的結(jié)果打印出設(shè)置的字符串

????操作系統(tǒng)--實(shí)模式到保護(hù)模式操作系統(tǒng)--實(shí)模式到保護(hù)模式

操作系統(tǒng)--實(shí)模式到保護(hù)模式

小結(jié)

????1.實(shí)模式下可以使用32位寄存器和32位地址

????2.顯存是顯卡內(nèi)部的存儲(chǔ)單元,本質(zhì)上與普通內(nèi)存無(wú)差別

????3.顯卡有兩種工作模式-文本模式與圖形模式

????4.文本模式下操作顯存單元中的數(shù)據(jù)能夠立即反映到顯示器

網(wǎng)站標(biāo)題:操作系統(tǒng)--實(shí)模式到保護(hù)模式
轉(zhuǎn)載來(lái)于:http://chinadenli.net/article20/gophjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、軟件開(kāi)發(fā)、微信公眾號(hào)、外貿(mào)建站、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)