手写操作系统 - 环境搭建

CPU 是怎么执行代码的

我们写的任何的语言代码最终都是给 cpu 执行的,要理解语言的本质那么最终还是要理解 CPU 的工作原理。我们手写操作系统后面也会遇到一系列的问题,有些问题站在 CPU 的角度来分析,解决起来会非常的快。

计算机开机启动流程

按下计算机电源键,硬件加电与自检。BIOS(传统):读取CMOS中的硬件配置(如启动顺序),执行加电自检(POST),初始化内存、显卡、硬盘等设备。UEFI(现代):替代BIOS,支持更大磁盘(GPT分区)、图形化界面、安全启动(Secure Boot),通过EFI服务(EFI Services)初始化硬件。

以 BIOS 为例,里面是一段固化的程序,加点会检测硬件,同时会把代码拷贝到内存中的 0xF0000 位置,然后让 cpu 跳转到 0xF0000 开始执行代码。后续代码会做一个非常重要的动作:会把磁盘的 0 柱面 0 磁道 1 扇区的数据拷贝到 0x7C00 的位置,然后跳转到 0x7C00 来执行。我只需要讲我们的操作系统的启动代码放在磁盘的第一个扇区里面,那么计算机就能进入我们的操作系统了。

环境搭建

r 复制代码
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

让操作系统从磁盘启动

bash 复制代码
; 这次课不需要太关注汇编,后面会讲两次课的汇编基础
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

; 第一个扇区是 512 字节,BIOS 在读取第一个扇区的时候会有一个约定最后两个字节必须是 0x55aa
times 510 - ($ - $$) db 0 ; 中间填充为 0
dw 0xaa55

CMake 项目管理

makefile 复制代码
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

操作系统系列,主要以视频的方式输出,大家感兴趣可以点击标题进入我的 bilibili

相关推荐
通玄2 小时前
Jetpack Compose 入门系列(十):Paging 3 分页加载
android
hunterandroid2 小时前
DataStore 工程化实践:迁移、并发更新与异常恢复
android·前端
程序员-珍5 小时前
报错下载android sdk失败
android·java
齊家治國平天下6 小时前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir6 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007476 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴7 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭7 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
止语Lab7 小时前
从 PHP 到 Go:真正迁移的是复杂度的归属
android·golang·php
CS创新实验室19 小时前
量子计算机的操作系统:原理、实践与经典架构之对比
架构·操作系统·量子计算