本文是操作系统真相还原在windows下的配置。
软件:
1.Bochs-2.6(注意是2.6,不要下载较新版本的,会有区别,导致错误)
2.NASM
3.wsl (用来写入,安装教程可以在其他地方找到)
一.首先我们写一个非常简单的MBRSECTION MBR vstart=0x7c00 ;告诉编译器起始地址编译为0x7c00
mov ax,cs ;接下来的5行是用cs寄存器来初始化其他寄存器
mov ds,ax ;因为BIOS跳过来的时候cs为0,而其他段寄存器只能由寄存器赋值,所以用cs的0来初始化
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00 ;栈初始化,因为在内存中这一块是专门留给MBR的,所以是安全的,可以当成栈地址
;清屏用0x06功能,上卷全部行,就实现了清屏的效果
;--------------------------------------------
;INT 0x10 功能号0x06 功能描述:上卷窗口
;输入
;ah 功能号=0x06
;al 上卷的行数(0表示全部)
;bh 上卷的行属性
;(cl,ch) 窗口左上的x,y位置
;dl dh 窗口右下x,y位置
;无返回值
mov ax,0x600
mov bx,0x700
mov cx,0
mov dx,0x184f
int 0x10
;下三行获得光标位置
;.get_cursor获取当前光标位置,在光标位置处打印字符
mov ah,3 ;3功能号是获取光标位置 需要存入ah寄存器
mov bh,0 ;bh存的是待获取光标页号
int 0x10 ;ch是光标开始行,cl是结束行
;dl是光标所在列号,dh是行号
;获取光标结束
;;;;;;;;;;;;;打印字符串;;;;;;;;;;;;
;10中断,不过这个使用13号子功能
mov ax,message
mov bp,ax ;es:bp是串首地址,es此时和cs一致,开头已经被sreg初始化
;光标位置要用到dx寄存器里面的内容,cx中的光标位置可以忽略
mov cx,5 ;cx为串长度,不包括最后的结尾0
mov ax,0x1301 ;13号子功能显示字符即属性,存入ah寄存器
;al设置写字符的方式 al=01,显示字符串,光标跟随
mov bx,0x2 ;bh是显示的页号,此处为0,bl是字符属性,黑底绿字02h
int 0x10 ;执行中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmp $ ;此处悬停
message: db "Hello, OS"
times 510-($-$$) db 0 ;补齐510个字符,因为系统检查是不是MBR是看最后两个字节是否0x55,0xaa
;所以要留出最后两个字符
db 0x55,0xaa
接下来用nasm编译:
nasm -o boot.bin boot.asm
这个时候你就获得了一个boot.bin文件。
二.使用bximage创建一个硬盘映像
进入Bochs的安装目录,启动命令行(cmd或powershell)
画横线的表示要手动输入,箭头表示直接按回车键就好了![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN5EWZhJ2YilTNkZTNhNDNzIGZwgTOhVmN2MGNxAjNw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
制作一个虚拟硬盘镜像。
四.使用Cygwin将引导扇区写进软盘
运行Cygwin,进入boot.bin和hd60Mc.img所在的目录(我存放在了bochs的安装目录),输入命令:dd if=boot.bin of=hd60Mc.img bs=512 count=1 conv=notrunc
五.使用Bochs启动刚刚写好的"操作系统"
1.写Bochs的配置文件bochsrcbochsrc保存在Bochs的安装目录下
bochsrc配置:
#第一步,首先设置 Bochs 在运行过程中能够使用的内存,本例为 32MB
megs: 32
#第二步,设置对应真实机器的 BIOS 和 VGA BIOS
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#第三步,设置 Bochs 所使用的磁盘,软盘的关键字为 floppy。
#若只有一个软盘,则使用 floppya 即可,若有多个,则为 floppya,floppyb…
#floppya: 1_44=a.img, status=inserted
#第四步,选择启动盘符
#boot: floppy #默认从软盘启动,将其注释
boot: disk #改为从硬盘启动。我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作
#第五步,设置日志文件的输出
log: bochsout.txt
#第六步,开启或关闭某些功能
#下面是关闭鼠标,并打开键盘
mouse: enabled=0
keyboard_mapping: enabled=1,map=$BXSHARE/keymaps/x11-pc-us.map
# 硬盘设置
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63
#下面的是增加bochs对gdb的支持,这样gdb便可以远程连接到此机器的1234端口调试了
#gdbstub:enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
注意:
ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63
这一行,都是上面运行bximage中的参数。
六.运行Bochs完成
二,对于nasm的一些使用
首先,最好把nasm放入环境变量中,这样在其他文件夹下进行操作会比较方便。
对于第三章,写一个内核的加载器,作者把boot.inc(相当于一个头文件一样的东西),写在了include文件夹下,文件树:
─boot
│ hd60M.img
│ loader.asm
│ MBR与显卡.asm
│ MBR与硬盘.asm
│
└─include
boot.inc
这样的格式。所以就需要给nasm提供库目录:
nasm -I 路径 MBR与硬盘.asm -o boot.bin
这里的路径可以写为绝对路径:D:operationbootinclude (注意最后一个斜杠必须要有)
也可写为相对路径: .include (在boot文件夹下)
于是可以用:
nasm -I .include MBR与硬盘.asm -o boot.bin (boot文件夹下)
来生成boot.bin