這將是一個(gè)非常非常長的博客,應(yīng)該這一個(gè)暑假都在寫著一個(gè)博客。
一直以來對(duì)計(jì)算機(jī)原理、操作系統(tǒng)非常感興趣。以前的操作系統(tǒng)課程就令人非常著迷。近日終于不需要天天熬夜了,終于有了幾天的閑暇時(shí)間,準(zhǔn)備實(shí)現(xiàn)一下之前的想法,自制一個(gè)操作系統(tǒng)。暫且命名為CherryOS吧(只是因?yàn)槲蚁矚g喝櫻桃味可樂)。
不知道最后能否寫出來,但是相信這個(gè)過程將是一個(gè)很有意義的過程。
Day1開始!
首先,開始之前,感謝《30天自制操作系統(tǒng)》這本書,本博客的大部分內(nèi)容也將是對(duì)這本書的理解與實(shí)現(xiàn)。同時(shí)此書出版時(shí)間過早,很多工具現(xiàn)在已經(jīng)有了更好的版本,很多工具也都棄用了。本博客會(huì)將書本中的部分工具換為其他工具。
系統(tǒng)環(huán)境
macOS 10.13.1 (17B1003)
CPU: 2.7 GHz Intel Core i7
RAM: 16 GB 2133 MHz LPDDR3
準(zhǔn)備工具
工欲善其事 必先利其器
第一步需要用到兩個(gè)工具
十六進(jìn)制編輯器——HexFiend
虛擬機(jī)——QEMU
這個(gè)操作系統(tǒng)是一個(gè)從0開始的操作系統(tǒng),現(xiàn)在我們手上沒有任何可以利用的工具,沒有C語言,甚至連匯編都沒有。我們唯一有的就是二進(jìn)制,或者說16進(jìn)制。一款好用的十六進(jìn)制編輯器將帶給我們很大的便利。
在這里我選用的是Hex Fiend,工具的選擇可以隨意能編寫十六進(jìn)制即可。
因?yàn)槲覀兪蔷帉懖僮飨到y(tǒng),所以調(diào)試運(yùn)行是個(gè)麻煩的事情。如果我們每一次運(yùn)行與調(diào)試都需要關(guān)閉當(dāng)前的操作系統(tǒng),那么這樣未免太麻煩了。虛擬機(jī)成為了我們必須要使用的工具。
在這里推薦使用QEMU,功能強(qiáng)大又小巧。
具體安裝方式:
macOS
兩種安裝方式:(推薦Homebrew)
Homebrew:
brew install qemu
MacPorts:
sudo port install qemu
Windows
官網(wǎng)下載安裝包:https://www.qemu.org/download/
Linux
Arch:
pacman -S qemu
Debian/Ubuntu:
apt-get install qemu
Fedora:
dnf install @virtualization
Gentoo:
emerge --ask app-emulation/qemu
RHEL/CentOS:
yum install qemu-kvm
SUSE:
zypper install qemu
至此,工具準(zhǔn)備完畢。
編寫Hello World
現(xiàn)在我們來寫第一個(gè)操作系統(tǒng),也就是操作系統(tǒng)屆的hello world。
打開Hex Fiend
輸入如圖字段:



000000->000080:
EB4E9048 454C4C4F 49504C00 02010100 02E00040 0BF00900 12000200 00000000 400B0000 000029FF FFFFFF48 454C4C4F 2D4F5320 20204641 54313220 20200000 00000000 00000000 00000000 00000000 B800008E D0BC007C 8ED88EC0 BE747C8A 0483C601 3C007409 B40EBB0F 00CD10EB EEF4EBFD 0A0A6865 6C6C6F2C 20776F72 6C640A00
0001F0:
00000000 00000000 00000000 000055AA F0FFFF00 00000000
001400:F0FFFF
剩下的內(nèi)容全為0,文件大小為80* 18 * 512 * 2 = 1474560字節(jié),這個(gè)很重要,一定要保證大小正確。
File->Save As 保存為cherryOS.img
至此,我們的第一個(gè)操作系統(tǒng)編寫完成。
到這里,我相信沒人知道在干什么。但是這的確可以運(yùn)行了。
原理解釋
我們現(xiàn)在在使用16進(jìn)制手動(dòng)編寫一個(gè)軟盤格式的文件。一個(gè)軟盤的大小就是1474560字節(jié),這也是為什么我們操作系統(tǒng)的大小要是1474560字節(jié)。BIOS讀軟盤第一個(gè)扇區(qū)時(shí),磁盤內(nèi)不同地方的內(nèi)容有不同的含義,這里不仔細(xì)說明每一位的含義了。其大概意思為,軟盤的格式為FAT12,軟盤的名稱為HELLOOS(這里并沒有改成CherryOS,因?yàn)檫@不是最終的系統(tǒng),這只是一次實(shí)驗(yàn))
如果將計(jì)算機(jī)的開機(jī)設(shè)置為從軟盤啟動(dòng),計(jì)算機(jī)開機(jī)會(huì)驅(qū)動(dòng)軟盤的磁頭0讀其0柱面1扇區(qū)的內(nèi)容到內(nèi)存0x7c00~ 0x7dff處,并檢查扇區(qū)最后兩2字節(jié)內(nèi)容,如果為55AAH,則從0x7c00開始執(zhí)行這段程序。
如果將一個(gè)好的軟盤的磁頭0對(duì)應(yīng)的0柱面1扇區(qū)內(nèi)含有一段(讓顯存)顯示“Hello world”的機(jī)器指令,且將扇區(qū)最后2個(gè)字節(jié)的內(nèi)容為55AAH。設(shè)置計(jì)算機(jī)開機(jī)時(shí)從軟盤啟動(dòng)后就能夠顯示“Hello World”。
這就是這一段代碼的基本原理
當(dāng)然我們編寫操作系統(tǒng)不可能用16進(jìn)制去編寫,這一段代碼只是一個(gè)小的實(shí)驗(yàn),為了像大家展示,這已經(jīng)是一個(gè)可以使用的系統(tǒng)了。后面,我們將用更高級(jí)的語言編寫操作系統(tǒng)。
其實(shí)就是匯編。。。。。
高級(jí)吧!。。。。。。
效果展示
用qemu加載cherryOS.img
命令行輸入:
qemu-system-i386 -hdd cherryOS.img
如果你看到這個(gè)畫面,就證明?。?!
你的第一個(gè)操作系統(tǒng)實(shí)現(xiàn)了?。。?!

hello world!
hello OS!
我們明天繼續(xù)!
對(duì)了,鑒于這個(gè)源碼手打起來很費(fèi)勁,點(diǎn)擊這里直接下載!哈哈哈哈!