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