?操作系統(tǒng)--實(shí)模式到保護(hù)模式
一.實(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ò)修改段地址解決沖突
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ū)
所以8086的處理方式-由于8086只有20位地址線,因此最高位被丟棄
所以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+的空間
C.保護(hù)模式
1.每一段內(nèi)存都擁有一個(gè)屬性定義(描述符)
2.所有段的屬性定義構(gòu)成一張表(描述符表)
3.段寄存器保存的是屬性定義在表中的索引(選擇子)
描述符的內(nèi)存結(jié)構(gòu)
描述符表
選擇子的結(jié)構(gòu)
進(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位偏移地址]
段屬性定義
選擇子屬性定義
保護(hù)模式中的段定義
匯編小貼士
section關(guān)鍵字用于"邏輯的"定義一段代碼集合
section定義的代碼段不同于[段地址:偏移地址]的代碼段
section定義的代碼段僅限于源碼中的代碼段
[段地址:偏移地址]的代碼段指內(nèi)存中的代碼段
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的依賴需要修改
準(zhǔn)備工作之后make,bochs之后看結(jié)果
發(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)處
可以在左邊對(duì)應(yīng)點(diǎn)地址處設(shè)置斷點(diǎn)來(lái)對(duì)結(jié)果進(jìn)行分析,結(jié)果如下
從右邊的結(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>
在這節(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)容的解釋是不同的,可以使用專屬指令或int 0x10中斷改變顯卡工作模式,在文本模式下的顯存的地址范圍映射位[0xB8000,0xBFFFF],一屏幕可以顯示25行,每行80個(gè)字符
????顯卡的文本顯示原理與文本模式下顯示字符
對(duì)段基址和段屬性進(jìn)行設(shè)置之后以及打印的結(jié)果,發(fā)現(xiàn)會(huì)在bochs上打印出結(jié)果p
在實(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ì)可以如下圖所示
在這里需要注意的是32位保護(hù)模式下的乘法操作是被乘數(shù)放到AX寄存器,乘數(shù)放到通用寄存器或內(nèi)存單元(16位),相乘的結(jié)果放在EAX寄存器中;同時(shí)$表示當(dāng)前行相對(duì)于代碼起始位置處的偏移量,$$表示當(dāng)前代碼節(jié)的起始位置
實(shí)現(xiàn)過(guò)程以及實(shí)現(xiàn)結(jié)果,可以看到實(shí)現(xiàn)的結(jié)果打印出設(shè)置的字符串
小結(jié)
1.實(shí)模式下可以使用32位寄存器和32位地址
2.顯存是顯卡內(nèi)部的存儲(chǔ)單元,本質(zhì)上與普通內(nèi)存無(wú)差別
3.顯卡有兩種工作模式-文本模式與圖形模式
4.文本模式下操作顯存單元中的數(shù)據(jù)能夠立即反映到顯示器
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文名稱:操作系統(tǒng)--實(shí)模式到保護(hù)模式-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://aaarwkj.com/article44/pjgee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、App設(shè)計(jì)、微信小程序、商城網(wǎng)站、做網(wǎng)站、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容