文章目录
一、基础环境搭建
硬件:一台笔记本电脑
软件:VM(虚拟机)
OS: Ubuntu 18.04
首先就是在笔记本电脑上搭建好虚拟机的环境,可以参考VMware Ubuntu 安装详细过程。
安装好环境后,就可以打开虚拟机进行后续的操作了
希望自己能够从0到1手写一个简易的操作系统!!!
二、搭建一个简单的操作系统
刚开始打算先跑起来一个简单的Hello OS。先上手后,再慢慢回头来看看它的细节。
2.1下载源代码
在虚拟机(Vmware)中打开terminal,使用git clone下载源代码。如果提示git command没找到,输入命令:
sudo apt-get install git
代码如下:源代码
其中文件:
entry.asm (汇编文件,有汇编定义的GRUB的多引导协议头,设定CPU工作模式,初始化CPU寄存器和C语言的运行环境)
main.c (我们自己这个操作系统的主函数源代码,里面就一个printf函数,功能是我们这个操作系统运行时显示的那句话)
vgastr.c (printf函数的具体实现代码,需要调用到显卡显存)
vgastr.h (主函数的头文件,控制计算机屏幕VGABIOS固件程序显示特定的字符)
Makefile (利用make工具来实现编译源代码,将main.c、vgastr.h等文件编译并链接)
install.md (确切的说,这是一段代码,有没有这个文件都行,主要是把其中的代码补充到/boot/grub/grub.cfg 文件的末尾,目的是更新grub 引导程序的配置文件,让grub能找到我们的helloOS)
2.2编译源代码
在下载的源代码中已经有Makefile文件描写了如何编译这个Hello OS,具体的代码
想要进一步了解可看Makefile入门
下面用一张图来描述我们的Hello OS 的编译过程,如下图所示:
在当前的路径下打开terminal,输入以下指令:
make all
2.3安装 Hello OS
经过编译之后,我们就可以得到 Hello OS.bin文件,但是我们还要让GRUB能够找到它,才能够在计算机启动的时候加载它。这个过程就是安装的过程,但是这里没有写安装程序,需要我们手动去操作。
经研究发现,GRUB 在启动时会加载一个 grub.cfg 的文本文件,根据其中的内容执行相应的操作,其中一部分内容就是启动项。
GRUB 首先会显示启动项到屏幕,然后让我们选择启动项,最后 GRUB 根据启动项对应的信息,加载 OS 文件到内存。
2.3.1安装基本的环境vim等等
由于后续需要在Ubuntu下更改文件内容,所以需要配置好vim这个Linux系统内建的文本编辑器。
2.3.2配置开机出现的GRUB引导界面
使用以下代码:(需要用到sudo命令来获取root权限)
sudo vim /etc/default/grub
打开此文件后,可以得到以下内容,我以Ubuntu18.04为例:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
主要改第二和第三行,如下所示:
GRUB_DEFAULT=0
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=30
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
退出保存,更新GRUB配置:
sudo update-grub
再次重启就可以看到开机启动选项了。
2.3.3在grub.cfg中添加menuentry
注意: 只能在update-grub 命令之后 给grub.cfg 文件添加启动项(menuentry)。
然后打开文件夹中的install.md,复制粘贴到 /boot/grub/grub.cfg 中。将其粘贴到文件的最后一行,下面来看看install.md文件中 Hello OS 的启动项:
//以下内容在install.md文件中
menuentry 'HelloOS' {
insmod part_msdos #GRUB加载分区模块识别分区
insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
set root='hd0,msdos2' #注意boot目录挂载的分区,这是我机器上的情况
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
boot #GRUB启动HelloOS.bin
}
但是这只是一个参考的内容,不同人的电脑不一样,需要根据自身情况去修改。
insmod part_XXX这个分区表要看是什么类型的是MBR还是GPT ,GPT就是 part_gpt,可使用parted命令查看。
set root 这一栏要看我们系统的bin文件在哪个分区,可使用df /boot/ 查看。不知道set root=‘hd?,msdos?’ 。使用df /boot 后会出现/dev?/sda? dev后面无信息就是0,代表第一块硬盘,1-代表第二块硬盘。sdax,?代表第几扇区,对应填到上面就行。
2.3.4将bin文件移动到相关目录下:
之后,就可以将我们之前运行的 Hello OS.bin 文件复制到/boot/目录下:
sudo cp HelloOS.bin /boot/
2.4重启电脑
重启我的虚拟机,在引导界面选中“Hello OS”,即可看到运行成功:
机器加电启动后,PC机第一个执行的指令就是固化在PC主板ROM芯片上的BIOS固件中的,它启动之后检测和初始化CPU、内存以及主板平台,然后加载引导设备(大概率是硬盘)中的第一个扇区数据。
BIOS寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader。Linux系统最常见默认的引导程序(boot loader)就是GRUB(GRand Unified Bootloader),它是一个用于加载和管理系统启动的完整程序,可以将它看成一个管家。引导程序是计算机启动时运行的第一个软件,它加载操作系统的内核,然后再由内核初始化操作系统的其他部分(包括 Shell、显示管理器、桌面环境 等等)。于是PC上电以后系统启动流程如下:
这就是PC机的启动流程。我们上面所完成的,就是由GRUB引导的“操作系统”——它会在屏幕上显示“Hello OS!“。
三、可能出现的问题
①提示没有装nasm, 无法编译汇编文件 .asm,解决方法,直接根据系统提示,输入命令安装该程序,可以输入以下命令:
sudo apt-get install nasm
②提示make不是命令,无法编译,解决方法,直接根据系统提示,输入命令安装该程序。可参考上面问题①的形式。
③开机启动选项引导界面点击后,没有运行成功,反而出现以下报错提醒:
error: file '/boot/HelloOS.bin' not found.
error: you need to load the kernel first.
提示无法找到文件,那就是install.md文件里的那段代码没写对,因为multiboot2/boot/HelloOS.bin无法找到file,需要改为multiboot2 /HelloOS.bin,并且要把这个HelloOS.bin文件复制到 " / " 路径下,这样才能成功。
参考资料
以上内容是我学习彭东老师的《操作系统实战45讲》后所进行的一个笔记记录,如有错误,还请各位大佬多多指教。
我主要参考了以下资料,十分感谢:
①操作系统实战45讲——彭东老师
②https://aeneag.xyz/articles/2022/03/27/1648377968693.html
③https://zhuanlan.zhihu.com/p/373996858