自己动手写操作系统 ----总计
2021.1.23
開始寫操作系統(tǒng)
好奇心是動(dòng)力的源泉,追究問題的本質(zhì)是優(yōu)秀黑客的必備素質(zhì),只有充分掌握了系統(tǒng)原理,才能在技術(shù)上游刃有余,才能有真正的創(chuàng)新和發(fā)展。中國(guó)需要更多真正的黑客,也希望更多的程序員能享受屬于黑客的創(chuàng)造樂趣。
創(chuàng)造·自由·開源
實(shí)踐–遇到問題–解決問題–再實(shí)踐
來自閑話Linux系統(tǒng)安全(一)——自主訪問控制(DAC),挺好的一段話
我們口中的操作系統(tǒng),一般指的是:一個(gè)操作系統(tǒng)核心+各種擴(kuò)展應(yīng)用程序。但從專業(yè)的角度來講,操作系統(tǒng)就是那個(gè)核心(通常稱之為內(nèi)核),就是將底層硬件進(jìn)行抽象和虛擬化,并向使用者提供各種功能接口的軟件程序。這是一種非常特殊的軟件程序,它的特殊之處就在于:操作系統(tǒng)是使用者運(yùn)行其他應(yīng)用程序的底層軟件基礎(chǔ),也是硬件功能被集中管理和調(diào)用的統(tǒng)一接口。它向上層隱藏了硬件結(jié)構(gòu)的丑陋和不易操作,使得使用者在使用計(jì)算機(jī)時(shí)變得更加簡(jiǎn)單;向下層屏蔽了底層硬件無法理解的使用者發(fā)出的復(fù)雜指令,將其翻譯成二進(jìn)制序列,使得硬件可以更加快捷的予以執(zhí)行。
Linux內(nèi)核,從它誕生的那天開始,變表現(xiàn)出極強(qiáng)的生命力,源自于UNIX的很多的哲學(xué)思想被沿用在Linux中。一切皆文件!多么簡(jiǎn)單但卻又復(fù)雜的一句話。說它簡(jiǎn)單,是因?yàn)閷?duì)于用戶來講,每一個(gè)系統(tǒng)的資源,包括各種硬件(磁盤、內(nèi)存、網(wǎng)絡(luò)等)和軟件都是以一種可訪問甚至是可編輯可修改的文件的方式來展現(xiàn),用戶不必再去思考底層的技術(shù)了;說它復(fù)雜,是因?yàn)檫@種抽象和虛擬是在大量的驅(qū)動(dòng)程序和數(shù)以百計(jì)的接口函數(shù)的支撐下得以完成的。
在這樣的一套系統(tǒng)中,使用者可以用自己掌握的自然語言向計(jì)算機(jī)發(fā)號(hào)施令,而計(jì)算機(jī)也會(huì)非常忠誠(chéng)地予以執(zhí)行,無論成功與否。這種簡(jiǎn)化給使用者帶來了極大的便利,但也同時(shí)會(huì)給計(jì)算機(jī)帶來很多的安全問題。比如說:誰能在什么時(shí)間對(duì)什么文件進(jìn)行什么操作?結(jié)果如何,成功還是失敗?如果成功會(huì)有怎樣的影響?如果失敗,是否會(huì)予以記錄?……等等
2021.2.3
2021.2.17
2021.2.26
| DS | 數(shù)據(jù)段寄存器 |
| SS | 棧段寄存器 |
| ES | 附加寄存器 |
| FS | 附加寄存器 |
| GS | 附加寄存器 |
- cx用作循環(huán)次數(shù)的控制
- bx用來存儲(chǔ)起始位置
- si 寄存器作為復(fù)制指令的源地址
mov ax,0x18
mov ds,ax
mov ax,[fs:0x1234]
2021.3.1
- 加電自檢
- BIOS引導(dǎo)
- 與BIOS交互
- 進(jìn)行硬盤讀取
計(jì)算機(jī)保護(hù)模式:16位的寄存器被擴(kuò)展成32位
改變寄存器的狀態(tài)實(shí)際就是改變cpu的動(dòng)作
向下兼容,原來的段+偏移的尋址機(jī)制,inter使用GDT全局描述符表這種數(shù)據(jù)結(jié)構(gòu)來描述,并使用一個(gè)叫做GDTR的寄存器去指向
將一個(gè)對(duì)數(shù)據(jù)的訪問分為三個(gè)部分,然后由cpu將其拼起來,這個(gè)過程叫保護(hù)模式下的尋址
實(shí)模式
- CPU復(fù)位(reset)或加電(power on)的時(shí)候以實(shí)模式啟動(dòng),處理器以實(shí)模式工作。
- 在實(shí)模式下,內(nèi)存尋址方式,由16位段寄存器的內(nèi)容乘以16(10H)當(dāng)做段基地址,加上16位偏移地址形成20位的物理地址,最大尋址空間1MB,最大分段64KB。
- 在實(shí)模式下,所有的段都是可以讀、寫和可執(zhí)行的。
2021.4.6
在保護(hù)模式下,32位環(huán)境下用一個(gè)段就對(duì)0到4G內(nèi)存的線性訪問,能直接訪問內(nèi)存空間,不用再進(jìn)行段基址的來回切換。溝壑成坦途,在程序分段的基礎(chǔ)上由操作系統(tǒng)統(tǒng)籌管理,解放生產(chǎn)力。
DPL表示CPU工作在特權(quán)級(jí)還是用戶級(jí)(0-3)
S字節(jié)中0表示系統(tǒng)段,1表示代碼段或數(shù)據(jù)段
G字節(jié)中0表示以字節(jié)為單位,1表示以4kb為單位
L是一個(gè)64位的代碼段標(biāo)志
TYPE表示描述符的子類型:4位組合表示代碼段或數(shù)據(jù)段的可讀、可寫或可執(zhí)行
2021.4.7
初始化GDT
通過lgdt進(jìn)行加載
關(guān)閉A20地址線
打開CR0寄存器
進(jìn)入保護(hù)模式
2021.4.8
GDT必須按手冊(cè)的規(guī)定位進(jìn)行賦值,這樣才能讓硬件識(shí)別,從而運(yùn)行
保護(hù)模式下的段寄存器 由 16位的選擇器 與 64位的段描述符寄存器 構(gòu)成
在整個(gè)系統(tǒng)中,全局描述符表GDT只有一張(一個(gè)處理器對(duì)應(yīng)一個(gè)GDT),GDT可以被放在內(nèi)存的任何位置,但CPU必須知道GDT的入口,設(shè)計(jì)者使用GDTR存放GDT的入口地址
局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干張,每個(gè)任務(wù)可以有一張。
LDT和GDT從本質(zhì)上說是相同的,只是LDT嵌套在GDT之中
.SECTION用于定義內(nèi)存的段
ALIGN將下一個(gè)變量對(duì)齊到規(guī)定的邊界
BITS指令指定NASM產(chǎn)生的代碼是被設(shè)計(jì)運(yùn)行在16位模式的處理器上還是運(yùn)行在32位模式的處理器上
LLDT 加載局部描述符
DPL表示段的特權(quán)級(jí),當(dāng)前代碼段區(qū)檢查對(duì)應(yīng)的真實(shí)地址時(shí),DPL會(huì)檢查程序間的允許級(jí)別是否一致,DPL較小的段有更高的訪問權(quán)限,如果低權(quán)限去訪問高權(quán)限則會(huì)崩潰
當(dāng)內(nèi)核代碼段寫入內(nèi)存后,后續(xù)的用戶程序代碼段的DPL肯定比內(nèi)核代碼段的大,從而防止內(nèi)核被覆蓋導(dǎo)致系統(tǒng)崩潰,實(shí)現(xiàn)內(nèi)存隔離
TSS Task Stack Segment(任務(wù)狀態(tài)段)要維護(hù)棧的結(jié)構(gòu),有三個(gè)(從ring0到ring4)權(quán)限狀態(tài)轉(zhuǎn)化堆棧,是cpu硬件原生的系統(tǒng)級(jí)別的數(shù)據(jù)結(jié)構(gòu)
TSS、LDT和GDT是受到硬件支持的系統(tǒng)級(jí)數(shù)據(jù)結(jié)構(gòu)
程序員寫的只是用戶態(tài)下面的半成品的程序,加載運(yùn)行由操作系統(tǒng)的內(nèi)核提供
TSS使用TR寄存器進(jìn)行維護(hù),這種硬件級(jí)別的數(shù)據(jù)結(jié)構(gòu),由軟件進(jìn)行填寫,最后使用硬件實(shí)現(xiàn)
CPL:Current Privilege Level
DPL:Descriptor Privilege Level
RPL:Request Privilege Level
應(yīng)用程序的可信級(jí)別低,操作系統(tǒng)的可信級(jí)別高,當(dāng)較低權(quán)限的任務(wù)需要使用高權(quán)限才能進(jìn)行處理時(shí),則需要操作系統(tǒng)提升該任務(wù)的權(quán)限
用戶程序調(diào)用內(nèi)核功能:
1.設(shè)計(jì)兩個(gè)相互跳轉(zhuǎn)的段
2.將這兩個(gè)段注冊(cè)到GDT中
3.設(shè)計(jì)一個(gè)門描述符
4.把門描述符寫到GDT中(門描述符反映了兩個(gè)段的跳轉(zhuǎn)關(guān)系)
操作系統(tǒng)主要做的就是三件事:造表,填表,查表
IDTR中斷描述符表寄存器
win系統(tǒng)有任務(wù)門、陷阱門、調(diào)用門、中斷門
2021.4.9
$$ 表示一個(gè)節(jié)的開始處被匯編后的地址
2021.4.12
搭建ubuntu系統(tǒng)
MBR只有512個(gè)字節(jié),不夠運(yùn)行操作系統(tǒng),那么將MBR的引導(dǎo)權(quán)交予loader,讓loader可以讀取硬盤中的多個(gè)扇區(qū),突破512字節(jié)的內(nèi)存限制,從而將操作系統(tǒng)內(nèi)核加載到內(nèi)存中
Loader的作用:加載內(nèi)核,打開保護(hù)模式,為系統(tǒng)啟動(dòng)準(zhǔn)備好軟硬件環(huán)境
用c進(jìn)行內(nèi)核的編寫,不是使用c庫,而是使用c的語法結(jié)構(gòu)
不使用c庫打印helloworld,表明c庫在操作系統(tǒng)之上
內(nèi)核加載過程
內(nèi)核中前512個(gè)字節(jié)是MBR,是硬件自動(dòng)加載的
2021.4.15
2021.4.16
2021.4.17
dd if=mbr.bin of=dingst.vhd bs=512 count=1d
dd if=Loader.bin of=dingst.vhd bs=512 count=1 seek=2(視頻中的count=2不行,括號(hào)內(nèi)的不寫入命令行)
dd if=kernel.bin of=dingst.vhd bs=512 count=1 seek=9
2021.4.19
0號(hào)功能調(diào)用
格式:
- MOV AH, 0
- INT 16H
功能:執(zhí)行時(shí),一旦捕獲鍵盤輸入,字符的ASCII碼放入AL中。若AL=0,則AH為輸入的擴(kuò)展碼。
1號(hào)功能調(diào)用
格式:
- MOV AH, 01H
- INT 16H
功能:用來查詢鍵盤緩沖區(qū)并設(shè)置ZF標(biāo)志。ZF=1表示無鍵按下;ZF=0表示有鍵按下,且AX=鍵值代碼(同AH=0功能)
2號(hào)功能調(diào)用
格式:
- MOV AH, 02H
- INT 16H
功能:檢查鍵盤上各特殊功能鍵的狀態(tài)。AL從高位到低位依次為Ins、Caps Lock、Num Lock、Scroll Lock、Alt、Ctrl、左Shift、右Shift各鍵的按下標(biāo)志位,按下時(shí),相應(yīng)位為1。
2021.4.20
2021.4.21
OS is a complex system; putting a programming layer ontop of the APl doesn’t eliminate the complexity——it merelyhides it. Sooner or later that complexity is going to jumpout and bite you in the leg. So ….….
2021.4.24
2021.5.5
5.操作系統(tǒng)內(nèi)核程序監(jiān)視I/O設(shè)備緩沖區(qū)的輸入,通過鍵入相關(guān)的指令可以進(jìn)行相關(guān)程序的運(yùn)行
-
按下電源開關(guān)時(shí),計(jì)算機(jī)主板和其他設(shè)備供電,BIOS的控制芯片組會(huì)向CPU發(fā)出并保持一個(gè)RESET(重置)信號(hào),重置CPU內(nèi)部狀態(tài),直到芯片組檢測(cè)到電源已經(jīng)開始穩(wěn)定供電后,便撤去RESET信號(hào)
-
CPU馬上就從地址FFFF0H處(BIOS在16位實(shí)模式下執(zhí)行,最大尋址范圍是1MB)開始執(zhí)行指令,這個(gè)地址存放一條跳轉(zhuǎn)指令,跳到系統(tǒng)BIOS中真正的啟動(dòng)代碼處
-
CPU讀取ROM的BIOS代碼,運(yùn)行bootblock, 由于ROM的執(zhí)行速度遠(yuǎn)比RAM要低,所以將BIOS代碼 shadow覆蓋到memory內(nèi)存中去,這樣可以減縮POST加電自檢的時(shí)間
-
boot block 是CPU在BIOS上固化的最小指令集代碼,用戶無法對(duì)其修改和刪除。這段代碼在CPU復(fù)位后首先被運(yùn)行,其功能主要是判斷運(yùn)行哪個(gè)存儲(chǔ)器上的程序、檢查用戶代碼是否有效、判斷芯片是否被加密、芯片的在應(yīng)用以及在系統(tǒng)編程功能
-
Boot,意思為“引導(dǎo)”,是計(jì)算機(jī)系統(tǒng)加電復(fù)位后CPU的第一個(gè)機(jī)器動(dòng)作
-
Load,意思為“加載”,是從低速非易失性存儲(chǔ)器ROM中“搬運(yùn)”一些數(shù)據(jù)到高速易失性存儲(chǔ)器RAM中
-
Shadow RAM也稱為"影子內(nèi)存",是為了提高計(jì)算機(jī)系統(tǒng)效率而采用的一種專門技術(shù),所使用的物理芯片仍然是CMOS DRAM(動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器,參閱本書后面的內(nèi)容)芯片。Shadow RAM占據(jù)了系統(tǒng)主存的一部分地址空間。其編址范圍為C0000~FFFFF,即為1MB主存中的768KB~1024KB區(qū)域。這個(gè)區(qū)域通常也稱為內(nèi)存保留區(qū),用戶程序不能直接訪問。Shadow RAM的功能就是是用來存放各種ROM BIOS的內(nèi)容。也就是復(fù)制的ROM BIOS內(nèi)容,因而又它稱為ROM Shadow,這與Shadow RAM的意思一樣,指得是ROM BIOS的"影子"?,F(xiàn)在的計(jì)算機(jī)系統(tǒng),只要一加電開機(jī),BIOS信息就會(huì)被裝載到Shadow RAM中的指定區(qū)域里。由于Shadow RAM的物理編址與對(duì)應(yīng)的ROM相同,所以當(dāng)需要訪問BIOS時(shí),只需訪問Shadow RAM而不必再訪問ROM,這就能大大加快計(jì)算機(jī)系統(tǒng)的運(yùn)算時(shí)間。通常訪問ROM的時(shí)間在200ns左右,訪問DRAM的時(shí)間小于100ns、60ns,甚至更短。
2021.5.7
2022.1.20
參考資料
[1] 自己動(dòng)手寫操作系統(tǒng)
[2]《ORANGE’S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》
[3] 平坦模型和分段模型
[4] Linux dd 命令
[5] Bios 是怎樣被載入內(nèi)存的?
[6] 《操作系統(tǒng) 真相還原》
[5] 計(jì)算機(jī)啟動(dòng)過程
總結(jié)
以上是生活随笔為你收集整理的自己动手写操作系统 ----总计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存储器分类
- 下一篇: “约见”面试官系列之常见面试题之第六十篇