打造个人操作系统:从零开始的自制与启动之旅

发表时间: 2024-03-26 00:52

本文通过制作Boot引导程序,让大家快速制作并启动自定义系统,熟悉其中的流程和工具使用。整个制作流程,主要分为三个步骤:1,创建一个虚拟软盘镜像;2,编写Boot引导程序;3,编译代码并启动系统。

1、创建虚拟软盘镜像

上一篇文章:自制操作系统之一:Centos7.9 安装 bochs,我们介绍了bochs软件的安装,不熟悉的小伙伴可以再看一下。Bochs软件安装完成之后,不仅会生成Bochs虚拟机软件,还会生成一些辅助工具,包括虚拟磁盘镜像创建工具bximage。借助bximage工具,可以方便的创建一个空的软盘镜像。具体操作步骤如下:

# 1、开始创建镜像[root@centos7.9 images]# bximage========================================================================                                bximage  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs         $Id: bximage.cc 12690 2015-03-20 18:01:52Z vruppert $========================================================================1. Create new floppy or hard disk image2. Convert hard disk image to other format (mode)3. Resize hard disk image4. Commit 'undoable' redolog to base image5. Disk image info0. Quit# 1.1、选择 [1], 创建一个软盘或则硬盘镜像文件Please choose one [0] 1# 1.2、选择软盘fd Create imageDo you want to create a floppy disk image or a hard disk image?Please type hd or fd. [hd] fd# 1.3、选择镜像大小,默认1.44MChoose the size of floppy disk image to create, in megabytes.Please type 160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M, or 2.88M. [1.44M] # 1.4、设置镜像文件名称 boot.imgWhat should be the name of the image?[a.img] boot.imgCreating floppy image 'boot.img' with 2880 sectorsThe following line should appear in your bochsrc:  floppya: image="boot.img", status=inserted  # 2、查看镜像大小  [root@centos7.9 images]# ll总用量 4-rw-r----- 1 root root 1474560 3月  24 21:06 boot.img# 3、查看镜像信息[root@centos7.9 images]# bximage========================================================================                                bximage  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs         $Id: bximage.cc 12690 2015-03-20 18:01:52Z vruppert $========================================================================1. Create new floppy or hard disk image2. Convert hard disk image to other format (mode)3. Resize hard disk image4. Commit 'undoable' redolog to base image5. Disk image info0. QuitPlease choose one [0] 5Disk image infoWhat is the name of the image?[c.img] boot.imgdisk image mode = 'flat'hd_size: 1474560geometry = 2/16/63 (1 MB)

2、编写Boot引导程序

创建好镜像之后,需要编写引导程序来填充镜像。操作系统的最底层基本都是汇编+c语言编写。以下为boot.asm引导程序,这段汇编代码的作用是启动自定义系统并在窗口输出Start Boot。后续再单独开一篇介绍代码含义,以及常见寄存器的用法介绍。

  org 0x7c00  BaseOfStack equ 0x7c00Label_Start:  mov ax, cs  mov ds, ax  mov es, ax  mov ss, ax  mov sp, BaseOfStack;=======  清理屏幕  mov ax, 0600h  mov bx, 0700h  mov cx, 0  mov dx, 0184fh  int 10h;=======  设置光标  mov ax, 0200h  mov bx, 0000h  mov dx, 0000h  int 10h;=======  屏幕显示   mov ax, 1301h  mov bx, 001fh  mov dx, 0000h  mov cx, 10  push  ax  mov ax, ds  mov es, ax  pop ax  mov bp, StartBootMessage  int 10h;=======  重置软盘  xor ah, ah  xor dl, dl  int 13h  jmp $StartBootMessage: db  "Start Boot", 0;=======  填充512B  times 510 - ($ - $$)  db  0  dw  0xaa55

3、编译启动系统

3.1、安装 nasm编译工具

yum install nasm

3.2、生成启动文件

# 编译字节码文件[root@centos7.9 asm]# nasm boot.asm -o boot.bin# 写入镜像文件[root@centos7.9 asm]# dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc记录了1+0 的读入记录了1+0 的写出512字节(512 B)已复制,0.000235742 秒,2.2 MB/秒

3.3、启动镜像

# 拷贝镜像到bochs目录[root@centos7.9 bochs-2.6.8]# cp boot.img /root/bochs-2.6.8/# 启动bochs模拟器[root@centos7.9 bochs-2.6.8]# bochs -f ./bochsrc        

3.4、查看启动效果

如果一切顺利的话,镜像启动之后,继续按c或者continue键,屏幕正常显示如下。至此从基础镜像制作、代码编译和启动运行的完成过程,一个简单的自制系统就完成了。除此之外,还有很多的问题等待去解决:系统的启动流程是什么,CPU是如何工作的,上述代码是如何生效的等等,待后续再一一解析。

自制系统启动


3.5、常见异常处理

  • 1、内存不足

.bochsrc 设置虚拟平台的可用物理内存容量不足(参数 megs:2048),Bochs会运行失败,可以适当调整内存大小,失败时的提示信息大致如下所示:

terminate called after throwing an instance of 'std::bad_alloc'what():   std::bad_allocAborted (core dumped)
  • 2、镜像文件故障

bochs 启动出现 No bootable device,需要重新检查 boot.asm文件代码问题,修复好之后,再重新编译打包运行。


4、ECS安装云桌面

在阿里云上购买一台ECS,安装Centos7.9系统,默认不带桌面云桌面服务的,可以自行安装,方便后续bochs调试。

4.1、更新系统的软件包

yum -y upgrade

4.2、安装MATE桌面环境

yum groups install "X Window System"yum groups install "MATE Desktop"

4.3、设置默认使用图形化桌面环境启动实例

systemctl set-default graphical.target

4.4、重启启动

reboot

安装完成之后,可使用VNC方式登录,登录成功,即可看到如下效果。

MATE Desktop