CPU 是怎么執(zhí)行代碼的
我們寫的任何的語言代碼最終都是給 cpu 執(zhí)行的,要理解語言的本質(zhì)那么最終還是要理解 CPU 的工作原理。我們手寫操作系統(tǒng)后面也會(huì)遇到一系列的問題,有些問題站在 CPU 的角度來分析,解決起來會(huì)非常的快。

CPU 是怎么工作的.png
計(jì)算機(jī)開機(jī)啟動(dòng)流程
按下計(jì)算機(jī)電源鍵,硬件加電與自檢。BIOS(傳統(tǒng)):讀取CMOS中的硬件配置(如啟動(dòng)順序),執(zhí)行加電自檢(POST),初始化內(nèi)存、顯卡、硬盤等設(shè)備。UEFI(現(xiàn)代):替代BIOS,支持更大磁盤(GPT分區(qū))、圖形化界面、安全啟動(dòng)(Secure Boot),通過EFI服務(wù)(EFI Services)初始化硬件。
以 BIOS 為例,里面是一段固化的程序,加點(diǎn)會(huì)檢測(cè)硬件,同時(shí)會(huì)把代碼拷貝到內(nèi)存中的 0xF0000 位置,然后讓 cpu 跳轉(zhuǎn)到 0xF0000 開始執(zhí)行代碼。后續(xù)代碼會(huì)做一個(gè)非常重要的動(dòng)作:會(huì)把磁盤的 0 柱面 0 磁道 1 扇區(qū)的數(shù)據(jù)拷貝到 0x7C00 的位置,然后跳轉(zhuǎn)到 0x7C00 來執(zhí)行。我只需要講我們的操作系統(tǒng)的啟動(dòng)代碼放在磁盤的第一個(gè)扇區(qū)里面,那么計(jì)算機(jī)就能進(jìn)入我們的操作系統(tǒng)了。
環(huán)境搭建
brew install bochs
brew install sdl2
brew install x86_64-elf-gcc
brew install x86_64-elf-gdb
brew install cmake
brew install qemu
vscode 安裝
vs 插件:c/c++
vs 插件:cmake
vs 插件:hex editor
vs 插件:masm
vs 插件:markdown
讓操作系統(tǒng)從磁盤啟動(dòng)
; 這次課不需要太關(guān)注匯編,后面會(huì)講兩次課的匯編基礎(chǔ)
org 0x7C00
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov si, msg
print:
mov ah, 0x0E
.next:
mov al, [si]
cmp al, 0
jz .done
int 0x10
inc si
jmp .next
.done:
hlt
msg:
db 'Hello MiniOS!!!', 0x0A, 0x0D, 0x0
; 第一個(gè)扇區(qū)是 512 字節(jié),BIOS 在讀取第一個(gè)扇區(qū)的時(shí)候會(huì)有一個(gè)約定最后兩個(gè)字節(jié)必須是 0x55aa
times 510 - ($ - $$) db 0 ; 中間填充為 0
dw 0xaa55
CMake 項(xiàng)目管理
BUILD:=./build
$(BUILD)/%.bin: %.asm
$(shell mkdir -p $(BUILD))
nasm -f bin $< -o $@ -l $(BUILD)/$*.lst
master.img: $(BUILD)/boot.bin
yes | bximage -q -hd=16 -func=create -sectsize=512 -imgmode=flat master.img
dd if=$(BUILD)/boot.bin of=master.img bs=512 count=1 conv=notrunc
.PHONY: clean
clean:
rm -rf $(BUILD)
.PHONY: bochs
bochs: master.img
bochs -q -debugger
操作系統(tǒng)系列,主要以視頻的方式輸出,大家感興趣可以點(diǎn)擊標(biāo)題進(jìn)入我的 bilibili