手把手教你制作一个操作系统
目錄
- 寫在前面
- 參考資料
- 開始動手
- 寫一個最小的操作系統
- 調試.COM
- 環境配置(Linux)
- 用VisualBox虛擬器運行Ubuntu系統
- 安裝Linux系統
- Dell筆記本的BIOS配置
- 保護模式
- 理解實模式和保護模式
- 增加一個用LDT描述的任務
- 特權集
寫在前面
筆者目前大二,學過C++,匯編,操作系統,正在學習編譯原理和計算機網絡,打算做一個小的操作系統來鞏固知識,加深對計算機的理解。
參考資料
目前正在學習《自己動手寫操作系統》,資源參考一下博客:
自己動手寫操作系統(高清圖書+源代碼)分享
開始動手
寫一個最小的操作系統
一開始就遇到困難了,書中說10分鐘完成一個操作系統,我花了一個小時了環境都沒弄好,好在學計算機的不怕折騰,先附張結果圖:
下面詳述步驟:
參考文檔:
- 《自己動手寫操作系統》—— 工作環境搭建
- 30天自制操作系統第一天–VirtualBox實現軟盤啟動
步驟:
1.首先去官網下載安裝NASM,配置環境變量,網址
2.下載虛擬機VirtualBox,網址(需要科學上網)
3.編寫源代碼,利用NASM編譯成.bin文件,使用FloppyWriter.exe將文件寫到TINIX.IMG文件里,經調試直接將后綴bin改成IMG好像也可以
4.新建一個虛擬機,網址,已經講得很詳細了,需要注意的是添加軟盤選擇IMG文件,我運行的時候試了幾次才出現紅色的“Hello,OS World!”,也不知道是什么原因。
這真的是太棒了,雖然你知道它有多么簡陋,但是,畢竟你已經制作了一個可以引導的軟盤了,而且所有工作都是你親手獨立完成的!
調試.COM
經歷了一個寒假,匯編都忘得一干二凈了,不得不從以前的教學文檔里找回一些零星的記憶。
還好DOSBox還在,如果沒有DOSBox,建議去官網下載一個,我找到了我安裝Masm的地方,在旁邊又把Nasm再安裝了一遍(這樣就不用在DOSBox\DOSBox-0.74\DOSBox 0.74 Options.bat里再配置一遍虛擬C盤了)
將boot.asm中的第一句改成org 07c00h,輸入nasm boot.asm -o boot.com,打開DOSBox,找到boot.com運行就能看到左上角的"Hello,OS World"了
(由于jmp $這條語句,目前應當是卡死了的)
也可以使用debug工具直接調試的
匯編課上學到的東西,終于派上用場啦!
環境配置(Linux)
用VisualBox虛擬器運行Ubuntu系統
按照書上所說,可以用虛擬器運行Linux系統,但是書上只給出了Visual PC版的安裝方法,如果使用VisualBox的話就要用別的方法了
參考文檔:Linux下載安裝過程 官網
這兩篇教程應該足夠了,只是耗費的時間比較長,如果順利的話,Tinix應該可以運行了
安裝Linux系統
VisualBox虛擬器上的Linux系統雖然容易安裝,但運行起來實在是太慢了,隨便一個命令都要等上好幾秒甚至幾十秒,像打開filefox這種直接就卡死機了,特別耽誤時間而且影響心態(不知道是不是我電腦的問題),總之,磨了一天多終于把Linux系統給裝上了,反正遲早要裝的。
參考鏈接:
1.新手安裝 Ubuntu 操作系統步驟教程
2.Ubuntu18.04安裝教程
Dell筆記本的BIOS配置
如果都能按教程的來不出錯的話,安裝過程將會容易得多,不知道是不是版本問題,我的BIOS和教程總有一些出入,每次教程看得一半就做不下去了,下面的博客整理了一些問題,希望大家安裝順利!
關于dell設置U盤啟動與安裝Ubuntu的幾個問題
安裝Ubuntu后需要一些配置,寫給工程師的 Ubuntu 20.04 最佳配置指南
保護模式
理解實模式和保護模式
由于各種原因,保護模式這章我卡了特別久,現在來整理一下。
參考文檔:
實模式與保護模式解惑之(一)——二者的起源與區別
實模式和保護模式區別及尋址方式
為了更方便的理解匯編代碼,首先要清楚兩種模式在尋址方式上的區別,了解開設A20線的意義(第一篇文章有提到),才能理解為什么進入保護模式前要先打開地址線A20。
(個人理解)保護模式其中“保護”的含義就是要保護系統程序,讓用戶程序不能隨便動系統程序空間的代碼,這個其實在我們操作系統課里學過,就是分段操作,不過實模式下雖然有segment的概念,由于采用 hysicaladdress=segment * 16 + offset 的模式,對保護系統程序并沒有什么作用;而保護模式中通過段選擇符指向段描述符,再由段描述符指向段段基址加上段內偏移地址得出線性地址(詳見第二篇文章),其中段描述符的S位和TYPE字段又將相應段分為了數據段、代碼段和系統段,不同段有不同的權限,從而真正體現了保護的作用。
增加一個用LDT描述的任務
不來點實戰真的不知道自己在看的什么。。。
正好看到書上62面有一個“讀者有興趣可以完成小任務”,做著試試看吧。
為了不搞復雜了,就熟悉熟悉LDT的用法,我們新建一個描述符表MYLDT,考慮到匯編不好調試的問題,為了少磨點心態,我們就把顯示的“L”替換成“S”,證明我們改過來了,開干!
- 在GDT中加入MYLDT段描述符與段選擇子
- 初始化
- 加載MYLDT
- 編譯
首先還是提醒一下最好別打錯字了,段選擇子和段描述符標簽最好復制粘貼,不細心的話編譯的時候可能就要像我這樣一個個改了
告訴大家一個技巧,記事本行頭雖然沒有行號標名,右下角的狀態欄還是有的,根據錯誤行數的提示可以快速定位到相應行數,加快debug速度。 - 運行
可以看到紅色的L變為S了,nice!
特權集
個人認為特權集是保護模式最本質待部分了,書上也講得十分復雜,我們來理順一下。
- CPL(Current Privilege Level) 當前執行的程序或任務的特權級 存儲在CS和SS的第0位和第1位上
- DPL(Descriptor Privilege level) 表示段或者門的特權級 存儲在段描述符或者門描述符的DPL中
- RPL(Requested Privilege Level) 避免低特權級應用程序訪問高特權級段內的數據 通過段選擇子的第0位和第1位表現
再對不同段整理一下
- 訪問數據段或者調用門或者TSS:CPL,RPL<=被訪問DPL
- 訪問非一致代碼段(不使用調用門):RPL<CPL=被訪問DPL
- 訪問非一致代碼段(使用調用門):CPL>被訪問DPL,RPL不檢查
- 訪問一致代碼段:CPL>被訪問DPL,RPL不檢查
總結
以上是生活随笔為你收集整理的手把手教你制作一个操作系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2162):知识回顾
- 下一篇: java信息管理系统总结_java实现科