最近有小伙伴給我提了個問題想幻,在Linux系統(tǒng)實模式下,有哪些操作可以正常運行话浇,分別有哪些比較常見的行為脏毯。
猛的一驚,雖說我不是專業(yè)搞這個的幔崖,但好歹也用了挺久的Linux系統(tǒng)食店,這是個啥子噢。之前把系統(tǒng)折騰壞了也沒見過這玩意赏寇,所以悄悄地去補課吉嫩,這次就給大家盡可能簡潔地分享下,Linux下的實模式(Real Mode)和安全模式(Protected Mode)到底和怎么一回事嗅定。
要了解它們的含義及區(qū)別自娩,還是要從尋址方式開始了解:
實模式下,虛地址到實地址轉(zhuǎn)換:DS段寄存器左移4位與偏移地址相加渠退,得到物理地址忙迁,最大尋址位是2的20次方脐彩,即1Mbyte℃⑷樱可尋址其中的任意地址惠奸,所有指令都相當(dāng)于工作在特權(quán)級,直接操作CPU的各種功能恰梢,沒有安全級別佛南,沒有分頁功能,沒有虛擬地址的概念删豺,只有物理地址共虑。各種寄存器的位寬基本上是16位的(段寄存器為20位)。
保護(hù)模式下呀页,虛地址到實地址轉(zhuǎn)換經(jīng)過MMU(內(nèi)存管理單元)妈拌,內(nèi)存管理采用段式+頁式的方式,最大尋址位2的32次方蓬蝶,即4G尘分。操作系統(tǒng)工作在最高優(yōu)先級0上,應(yīng)用程序則運行在較低優(yōu)先級丸氛。各種寄存器的位寬基本上都是32位的培愁,但是可以兼容同名的16位寄存器,兼容實地址模式缓窜,即實地址模式的程序無需再編譯即可跑在保護(hù)模式下定续。
Intel 80286及以后的處理器除了安全模式,另一種工作模式是實模式(僅當(dāng)系統(tǒng)啟動的一瞬間)禾锤,在此期間出于兼容性的考慮私股,會關(guān)閉一些芯片的新的保護(hù)功能特性,從而容許老的軟件能夠運行在新的芯片上恩掷。
實模式是一種比較原始的模式倡鲸,能看到CPU設(shè)計的初始過程。在大多情況下黄娘,實模式就是在CPU啟動的時刻的低級模式峭状,無需OS在該模式上做過多的事情,而僅僅為向高級模式轉(zhuǎn)化做準(zhǔn)備逼争。
相比之下优床,保護(hù)模式解決了實模式下的低劣的內(nèi)存管理方式可能導(dǎo)致的問題,在實模式下用戶程序自行通過指針訪問物理地址氮凝,如果其中地址轉(zhuǎn)換錯誤導(dǎo)致訪問到系統(tǒng)區(qū)域并進(jìn)行修改羔巢,后果可能是災(zāi)難性的。而在保護(hù)模式下罩阵,地址轉(zhuǎn)換是由操作系統(tǒng)完成的竿秆,程序?qū)Υ艘粺o所知,確保了地址訪問的正確性稿壁。
現(xiàn)代多數(shù)的x86處理器操作系統(tǒng)都運行在保護(hù)模式下幽钢,包括Linux, Free BSD,?和Windows3.0(它也運行在實模式下,為了和Windows 2.x應(yīng)用程序兼容)及以后的版本傅是。
通過尋址方式的不同及可訪問的地址的區(qū)別匪燕,可以看出保護(hù)模式和實模式的根本區(qū)別是進(jìn)程內(nèi)存受保護(hù)與否⌒剩可尋址空間的區(qū)別只是這一原因的結(jié)果帽驯。
總結(jié)一下,實模式和保護(hù)模式在存儲器尋址和虛地址到實地址的轉(zhuǎn)換有所不同书闸。處理器在剛剛上電或者重啟后的時候尼变,處于實地址模式,在那期間的操作是面向物理地址的浆劲,更深入底層嫌术,更容易出錯。而在保護(hù)模式下牌借,能更好地避免誤操作的問題度气,而處于兼容性考慮又會關(guān)閉一部分安全性能。
最后再回到之前那位朋友提的問題膨报,他提的是一道選擇題磷籍。
下列過程在實模式下運行的有:
A.BIOS加載啟動扇區(qū)
B.啟動扇區(qū)加載Grub的kernel.img
C.Grub加載Linux內(nèi)核
D.Linux內(nèi)核加載驅(qū)動
上面給大家介紹的內(nèi)容只是從一個大的概念上對比了保護(hù)模式和實模式的區(qū)別。要解決這道題還是要從實模式在實際運行中的作用以及Linux啟動程序的流程來分析现柠。
一般BIOS程序都是在實模式下使用的院领,BIOS是寫進(jìn)ROM(只讀存儲器 )里面的,但是BIOS程序物理地址空間不僅僅是RAM(隨機存取存儲器)晒旅,還包含ROM和內(nèi)存映射設(shè)備栅盲。A選項BIOS加載啟動扇區(qū),是在實模式下運行的废恋。
Linux啟動程序的流程大致為:上電BIOS自檢谈秫;啟動Boot Loader(GRUB);加載內(nèi)核鱼鼓;啟動第一個進(jìn)程拟烫;配置環(huán)境。B選項扇區(qū)加載Grub的kernel.img迄本,其中kernel.img是core.img的組成模塊硕淑,用于協(xié)助啟動內(nèi)核。而在BIOS加載啟動扇區(qū),扇區(qū)加載Grub的kernel.img模塊用于啟動內(nèi)核置媳,引導(dǎo)程序是在實模式下運行的于樟,因此此時還處于實模式下。
而引導(dǎo)程序的最后一步便是把內(nèi)核加載到內(nèi)存拇囊,之后就可以使用虛擬地址映射物理內(nèi)存了迂曲。因此Grub加載Linux內(nèi)核也在實模式下。
BIOS最后的工作將MBR(主引導(dǎo)程序)加載到內(nèi)存開始運行寥袭。至此BIOS的工作就結(jié)束了路捧,實模式也結(jié)束了。之后的工作是MBR中的程序又將loader從硬盤中加載到內(nèi)存開始運行传黄,即讀取硬盤內(nèi)的系統(tǒng)系統(tǒng)開始啟動杰扫。因此后續(xù)的內(nèi)核加載驅(qū)動已經(jīng)不在實模式下了。
答案應(yīng)該是:ABC
借此次機會也學(xué)習(xí)了一波膘掰,希望能給各位有興趣的小伙伴一點學(xué)習(xí)思路章姓。有什么問題的話可以私聊我,或是評論區(qū)討論炭序,希望這次分享對大家有幫助啤覆。