(2021年10月30日打卡第三天)
打卡第三天:在windows系统下搭建自制操作系统的环境
1、所需软件
虚拟机:VirtualBox
https://www.virtualbox.org/wiki/Downloads
汇编编译器:nasm
Bochs和磁盘写入程序dd
软件打包下载链接:
百度网盘:link
提取码:qipy
链接: https://pan.baidu.com/s/17fylk0tfNe9sYzUjH4F0dA 提取码: qipy 复制这段内容后打开百度网盘手机App,操作更方便哦
2、通过win7或win10自带的diskpart命令制作自己的虚拟磁盘
打开命令行窗口cmd,输入命令:diskpart,回车:
DISKPART>create vdisk file=e:\myos\zp.vhd maximum=10 type=fixed
maximum=10,表示10M;
type=fixed,表示固定的;
3、编写启动引导代码
org 07c00h ;告诉编译器你把这个程序加载到7c00处,当bios检查完毕后,它就能跳到这个位置开始执行
mov ax, cs ;表示把代码段寄存器放到ax里面去
mov ds, ax
mov es, ax
call Display ;Display是一个函数
jmp $ ;表示无限循环,因为$表示当前位置,jmp $就表示一直跳到当前行,CPU不再往下执行了
Display:
mov ax, BootMsg ;BootMsg代表字符串
mov bp, ax ;
mov cx, 16 ;这个16是BootMsg字符串的长度
mov ax, 01301h ;设置字符串颜色
mov bx, 000ch
mov dl, 0
int 10h ;表示调第10号中断
BoosMsg: db "Hello, OS World!"
times 510 - ($ - $$) db 0 ;表示从当前位置起到末尾的510字节这一段全部用0填充
dw 0xaa55 ;这512个字节最后两个字节的值是0xaa55,这是约定,必须这样写机器才能识别你是一个可引导的扇区
4、生成二进制文件
点击上图地址栏,输入cmd,回车,自动打开命令行窗口cmd,路径也是该目录:
由于我的nasm.exe程序在nasm2目录里,所以请注意各个文件(zp.VHD、hello.asm、nasm.exe、dd.exe)所在路径位置:
输入如下命令编译hello.asm,生成hello.bin二进制文件。
nasm e:\myos\hello.asm -o e:\myos\hello.bin
然后我们进入tools目录:
5、把生成二进制文件写进虚拟磁盘
dd是用于磁盘操作的命令。
dd if=..\hello.bin of=..\zp.vhd bs=512 count=1
if:input file的缩写,导入的文件、输入的文件;
bs:此项指定块的大小,由于dd是以块为单位来进行IO操作的,此项是统计配置了输入块大小ibs和输出块大小obs;
count:此项是指定拷贝的块数。
上面dd命令中的两个点…代表上层目录,写绝对路径太麻烦。
回车后,一定要注意命令提示中的:
1+0 records in \\记录了1+0的读入
1+0 records out \\记录了1+0的写出
表示写成功了。
6、启动我们自制的os
文件夹选一个位置,类型和版本一定要选Othrer,因为这是我们自己写的操作系统;
这个地方千万不要把内存写大,不是说内存越大越好,4M足够我们用了,你保持默认的64M也没问题;
使用已有的虚拟硬盘文件,这个时候里面肯定没有,你选择注册,然后选择我们生成的虚拟磁盘文件hello.vhd,然后点创建;
点击启动:
运行成功,环境搭建完成。
7、会遇到的问题
有时候我们可能会把写入过的盘片zp.vhd删除,重新通过diskpart命令制作虚拟磁盘zp1.vhd,重新dd写入我们自己编写的操作系统,例如:
dd if=..\mbr.bin of=..\zp1.vhd bs=512 count=1
之后,我们看一下设置:
可以看到此时上图zp.vhd正常。
点击启动,报错:
- 出现问题:可以看到“不能为许你电脑myos打开一个新任务”,明细里说了是UUID不匹配,并且存储那块显示zp.vhd(普通,无法访问),我们把明细复制到记事本里。
在设置里也可以看到zp.vhd前面的图片是个叹号,提示UUID不匹配。
我们删除该盘片,点击控制器:IDE,下面添加存储附件的按钮就有颜色生效了:
添加硬盘:
也可以看到zp.vhd这个盘片有问题,我们点击注册,选择刚才新创建的虚拟磁盘zp1.vhd之后,点击启动,正常运行;
也就是说,我们重新创建一个别的名字的虚拟磁盘文件,重新注册一下就可以了。
- 另一种解决方法:
我们先从设置里把这个有问题的盘片zp.vhd删除,然后确定VirtualBox安装目录里的VBoxManage.exe程序的路径,然后通过如下命令重新分配UUID:
E:\myos>"E:\Program Files\Oracle\VirtualBox\VBoxManage.exe" closemedium disk
因为 VirtualBox 虚拟机用 UUID 管理硬盘,所以每次挂载硬盘时,都需要删除虚拟硬盘的 UUID 并重新分配。
从上图可以看到,此时就没有那些问题盘片了,点击注册,重新选择我们的虚拟磁盘文件即可。
virtualbox虚拟机命令行添加新硬盘
https://blog.csdn.net/weixin_34336292/article/details/91759952
VBoxManage命令用法详解
https://www.cnblogs.com/readleafblackrain/articles/3974882.html
《操作系统实战 45 讲》13课win+virtualbox实操视频
https://www.bilibili.com/video/BV1yb4y1N7ya/
生产虚拟硬盘
dd bs=512 if=/dev/zero of=hd.img count=204880
格式化虚拟硬盘
sudo losetup --find --show hd.img
/dev/loop17
sudo mkdir hdisk
sudo mkfs.ext4 -q /dev/loop17
sudo mount -o loop ./hd.img ./hdisk/
sudo mkdir ./hdisk/boot/
安装GRUB
sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/loop17
sudo vim ./hdisk/boot/grub/grub.cfg
转换虚拟硬盘格式
安装虚拟硬盘