【项目实战】如何写一个操作系统?
目录
- 【项目实战】如何写一个操作系统?
- 前言
- 下载32位的lucid系统
- 解决旧版系统下载源失效的问题
- 利用共享文件夹将下载的.deb文件上传系统中
- 如何解决下载了g++但是不能使用的问题?
- 编译系统源文件
- 配置grub和qemu
- 项目拓展
作者:爱写代码的刚子
时间:2024.6.16
前言:本篇博客将会带着大家参与开源项目How to Make a Computer Operating System in C++
项目地址
本篇博客将会先教大家如何配置这个环境,毕竟自己也是折腾了几天,在过程中有什么问题可以向作者提出
前言
由于该项目为早期项目,使用了virtualbox作为虚拟机并使用了lucid系统进行编译,版本古老,针对intel芯片的Mac以及window和Linux可以参与该项目中,但是目前virtualbox对于M芯片的Mac支持的并不好,所以不推荐M系列的Mac参与该项目。
下载32位的lucid系统
使用virtualbox下载lucid系统
virtualbox需要自己去下载系统来完成安装
下载地址
安装完成系统后我们先熟悉一下virtualbox软件:
- 学习如何使用共享文件夹将文件上传到虚拟机(网上有一些教程)
如果有失败的情况说明要安装增强功能,找到增强功能点击安装即可(作者是每次开机都安装来保证成功)
解决旧版系统下载源失效的问题
刚开始启动lucid系统可能会没有vim等基础软件,所以我们需要手动换源
可以先尝试手动更新下载源:vim /etc/apt/sources.list手动换源
由于作者没有成功所以自己去搜索下载源,地址
这里有gcc编译器源
我们需要找到g++,gcc,nasm的下载源进行安装(这个可能要自己去找)
利用共享文件夹将下载的.deb文件上传系统中
将下载的文件拖放进共享文件夹即可
在当前目录使用命令sudo dpkg -i .deb安装.deb文件
如何解决下载了g++但是不能使用的问题?
没有建立软连接,找到g++目录使用ln命令建立软连接即可。
编译系统源文件
下载开源项目的代码,拖入共享文件夹
cd src/kernel
进入后使用make all指令
很不幸,你可能会看到有关-m32、-o等报错
解决:
进入/src/kernel/arch/x86目录,找到config.make文件,编辑它
找到它们并去掉它(是因为高版本的g++不在支持这些选项)
同时最好将库文件stdarg.h手动放到相应的目录有可能编译时找不到相应的库文件
如果你编译完成了就可以进行下一步了
配置grub和qemu
编译完成后由于找不到qemu和grub的下载源,于是作者更换成了Debian系统下载了相应版本的qemu和grub,然后更改了qemu.sh和diskimage.sh脚本,换成相应的qemu版本,注意脚本中的文件存放位置,然后就可以使用make run运行了
- 注意也要根据自己机器的环境修改脚本,以我的机器环境举例:
diskimage.sh
#!/bin/bash# 创建虚拟磁盘镜像 c.img 大小为 2MB
qemu-img create c.img 2M# 使用 fdisk 命令对 c.img 进行分区和设置
fdisk ./c.img << EOF
x # 进入扩展模式
c # 设定柱面数为 4
h # 设定磁头数为 16
s # 设定扇区数为 63
r # 重新开始分区表
n # 新建分区
p # 主分区
1 # 分区号为 1
1 # 起始扇区从第1个扇区开始
4 # 分区大小为 4个扇区
a # 激活分区1
1 # 激活标志位
w # 将所有更改写入磁盘
EOF# 显示 c.img 的分区信息
fdisk -l -u ./c.img# 将 c.img 映射到 /dev/loop1
losetup -o 32256 /dev/loop1 ./c.img# 格式化 /dev/loop1 为 ext2 文件系统
mke2fs /dev/loop1# 挂载 /dev/loop1 到 /mnt/
mount /dev/loop1 /mnt/# 复制 bootdisk 目录下的内容到 /mnt/
cp -R bootdisk/* /mnt/# 卸载 /mnt/
umount /mnt/# 使用 grub-install 安装 GRUB 到 c.img
/usr/sbin/grub-install --target=arm64-efi ./c.img << EOF
device (hd0) ./c.img
geometry (hd0) 4 16 63
root (hd0,0)
setup (hd0)
quit
EOF# 解除 /dev/loop1 的映射
losetup -d /dev/loop1
qemu.sh
qemu-system-aarch64 -machine virt -m 1024 -cpu cortex-a57 \-drive file=c.img,format=raw,id=hd0,if=none \-device virtio-blk-device,drive=hd0 \-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd
项目拓展
完善这个项目即可(项目中也存在一些bug,需要自己去发现)