从头写一个操作系统 01

in code •  6 years ago  (edited)

开始前,如果不熟悉右边的知识点,建议先google: assembler, BIOS

本节的目标:创建一个可以被BIOS识别的,可作为启动介质的文件

我们马上就要亲自完成一个引导扇区,你一定会很有成就感!

理论:

计算机启动时,首先启动的是BIOS,但BIOS并不知道如何启动操作系统,它会把启动的
工作交给引导扇区中的指令。因此,引导扇区需要放在一个约定俗成的标准
位置上,也就是磁盘最开始 (cylinder 0, head 0, sector 0) 的那512个字节。

为了确认这个磁盘是可启动的,BIOS会确认启动引导扇区的第511与512字节
处是否是“0xAA55”。

以下是一个简单例子:

e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 29 more lines with sixteen zero-bytes each ]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

如果是在windows系统上,也可以用BZ这个软件直接
编辑一个二进制文件,保存为.bin文件
BZ-bootbin.png

上面文件的内容,几乎都是0,并由16位的‘0xAA55’作为结尾(要注意X86是小端机)。开头的三字节使程序
进入无限循环。

最简单的引导扇区

你可以像上面,用二进制编辑器写512个字节,也可以写一个非常简单的汇编文件。

; Infinite loop (e9 fd ff)
loop:
    jmp loop 

; Fill with 510 zeros minus the size of the previous code
times 510-($-$$) db 0
; Magic number
dw 0xaa55 

编译:
nasm -f bin boot_sect_simple.asm -o boot_sect_simple.bin

我知道你现在一定想看看,这个系统是否能够运行:

qemu boot_sect_simple.bin

在一些系统上,你可能要这样运行qemu-system-x86_64 boot_sect_simple.bin
如果出现 SDL error, 试试添加 --nographic 与 --curses flag(s)的组合.

你会看到打开的窗口仅仅显示了“Booting from Hard Disk...”。洋洋得意!;-)

windows 上你需要把那个.bin文件用FloppyWriter这个软件写入到一个img文件中,然后用vmware创建一个未装系统的虚拟机,添加软盘硬件,向软盘中载入上面的img文件,然后启动虚拟机吧,你会看到一个什么字都没有的死循环,那同样代表你成功了,如果没有成功,会出现未发现操作系统的提示。至于vmware的操作请自行百度,未来的学习道路中会出现各种各样的困难,vmware这样的商业软件已经是友好至极了。

我们再进一步,让屏幕打出“Hello"
汇编的代码如下:

;boot_sect_hello.asm
mov ah, 0e
mov al, 'H'
int 0x10
mov al,'e'
int 0x10
mov al,'l'
int 0x10
mov al,'l'
int 0x10
mov al,'o'
int 0x10

jmp $
times 510-($-$$) db 0
dw 0xaa55

nasm -f bin boot_sect_hello.asm -o boot_sect_hello.bin
qemu-system-i386 boot_sect_hello.bin
启动系统的屏幕上将打出Hello几个字。
查看二进制文本:
hexdump boot_sect_hello.bin

将二进制直接使用BZ编辑器写入文件,如下:
boot_hello.png
再用FloppyWriter.exe写入Image
FloppyWriter.png
使用VMWare载入软盘镜像,启动系统将输出:
vm_hello.png

是不是很完美?这让我想起了十几年前的一个笑话,有一个大神给朋友修电脑,一个下午一直坐再那里敲0和1,最后电脑终于能够启动了,原来这个大神用0和1写了一个操作系统。我们同样用0和1写了一个系统(例如上面的B4 0E 对应二进制1011 0100 0000 1110 ),只是很简单。

注,本文翻译自github上的开源项目https://github.com/cfenollosa/os-tutorial,
其中windows部分由本人添加,利于集思广益,但并不推荐使用windows系统
学习后面的内容。

BZ下载地址:http://www.vcraft.jp/soft/Bz162.zip
floppywriter 这个软件在csdn上能找到

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

看来不错。期待看进展!

Posted using Partiko Android

谢谢,我努力!

下次如果用 esteem 发,顺便加个 #esteem #esteem-cn 给我们吧。蟹蟹

Posted using Partiko Android

好的,第一次发不知道,下次一定加上! :)

好。最佩服码农滴。每24小时可以领一次大佬点赞的🙂

Posted using Partiko Android

好的:)

Thanks for using eSteem!
Your post has been voted as a part of eSteem encouragement program. Keep up the good work! Install Android, iOS Mobile app or Windows, Mac, Linux Surfer app, if you haven't already!
Learn more: https://esteem.app
Join our discord: https://discord.gg/8eHupPq