操作系统实践之路(一、环境配置)

本文介绍了如何在Ubuntu环境下,从基础环境搭建到构建一个简单的操作系统HelloOS,包括下载源代码、编译、安装HelloOS及配置GRUB引导界面的过程。详述了必要的步骤和可能遇到的问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础环境搭建

硬件:一台笔记本电脑

软件: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值