手写操作系统 01

206 阅读2分钟

不废话直接干货

我的github url

文章

  1. 手写hello world
  2. 手写loader
  3. 进入保护模式
  4. 开启分页
  5. kernel
  6. 汇编与c互相调用

需要的环境 windows环境

  1. clion(编辑器,看反汇编寄存器用的)
  2. bochs(运行汇编用的,可以debug)
  3. nasm(汇编编译器)
  4. dd.exe命令(构建镜像)
  5. ob(调试应用)

Snipaste_2024-06-13_15-55-05.png

等下我会打包一个百度云分享出来 github也又相关的文件

1. 编写汇编文件

hello.asm

;表示当前文件被加载到0x7c00h这个位置
org 0x7c00
;把0移动到ax,初始化ax寄存器
mov ax,0
mov ss,ax
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax

call clear_screen
call hello
;原地跳转,死循环  $的意思是当前行
jmp $

;清屏执行流
clear_screen:
    mov ax,12h
    int 10h
    ret

;hello 函数/执行流
hello:
    mov ax,helloMsg
    mov bp,ax
    mov cx,16
    mov ax,01301h
    mov bx,000ch
    int 10h
helloMsg : db "hello,os world"
;循环 510-(当前-本块代码块的长度)
;为什么是510,因为最后需要两个字节55aa
;磁盘第一块位置512字节,并且最后是55aa,那就表明这是一个引导 boot
times 510-($-$$) db 0
dw 0xaa55

Snipaste_2024-06-13_15-55-51.png


问题

1. 为什么是0x7c00?

3a220744462e4b14ba204be10cab13d8.png 实模式先的内存约定

2. 为什么结尾要是0xaa55

需要一个魔数标识第一个扇间是引导

3. 谁读取了0x7c00的代码

bios默认跳转到0x7c00

2. 编译汇编

nasm hello.asm -o hello.bin

3. 打包镜像

dd if=hello.bin -o hello.img bs=512 count=1

4. bochs运行镜像

bochsdbg -q -f bochsrc

bochsrc文件配置
magic_break: enabled=1
display_library: win32, options="gui_debug"
floppya: image="a.img", status=inserted
romimage: file="D:\software\Bochs-2.8/BIOS-bochs-latest", address=0x00000000, options=none
vgaromimage: file="D:\software\Bochs-2.8/VGABIOS-lgpl-latest"
config_interface: win32config

Snipaste_2024-06-13_15-55-05.png

  1. 改成 D:\software\Bochs-2.8 自己的bochs的文件夹地址
  2. a.img 换成hello.img
  3. bochsrc可以在bochs的linuxdemo里面找到,需要改一些配置
  4. config_interface改成 win32config
奉上Makefile文件
path=E:\project\c++\os_kernel

build:
    mkdir $(path)\build
    $(path)\nasm-2.16.01\nasm hello.asm -o $(path)\build\hello.bin
    $(path)\dd if=$(path)\build\hello.bin of=$(path)\build\hello.img bs=512 count=1


clean:
    rmdir  $(path)\build /s /q


bochs:
    D:\software\Bochs-2.8\bochsdbg -q -f bochsrc

Snipaste_2024-06-13_15-56-01.png

path改成自己文件夹的位置

Snipaste_2024-06-13_15-54-23.png

成功了

最后

想编写这个操作系统的可以找我讨论,我建立了交流群,我拉大家进群,一起解决问题