今天看了极客时间操作系统实战的专栏,在实现简单内核(没有任何功能,只是打印出一句话)时也遇到了一些问题,这里记录一下。
这里不自己写引导汇编加载扇区的汇编代码,而是直接使用Ubuntu自带的GRUB 加载我们的OS。
1 编写代码
entry.asm 处理好C语言的工作环境
main.c Hello OS的主函数,里面的printf函数需要我们自己去实现
vgastr.h vgastr.c 实现printf函数(显存开始的地址是0xb8000)
void _strwrite(char* string)
{
char* p_strdst = (char*)(0xb8000);//指向显存的开始地址
while (*string)
{
*p_strdst = *string++;
p_strdst += 2; //跳过字符颜色信息的空间
}
return;
}
void printf(char* fmt, ...)
{
_strwrite(fmt);
return;
}
2 编译 OS
使用到了 make工具 和 makefile文件,这里还不是很理解。
经过编译我们会得到一个Hello OS.bin 文件,让GRUB能够找到这个文件,在操作系统启动的时候我们就可以加载他。
3 安装
GRUB 在启动时会加载一个 grub.cfg 的文本文件,我们对他进行修改加入我们的Hello OS启动项:
menuentry 'HelloOS' {
insmod part_msdos #GRUB加载分区模块识别分区
insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
set root='hd0,msdos4' #注意boot目录挂载的分区,这是我机器上的情况
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
boot #GRUB启动HelloOS.bin
}
修改grub.cfg时权限不够,解决办法:
命令是sudo chmod +w /boot/grub/grub.cfg。
然后是sudo gedit /boot/grub/grub.cfg。
然后需要把 HelloOS.bin 文件放到/boot/目录下
先使用 df /boot/ 命令查看boot目录挂载的分区(然后去改动set root这一行)
如果上面这个命令失效 可以df-h 查看所有文件挂载找到boot
移动HelloOS.bin到boot目录时又出现了错误,解决办法:
运行命令sudo nautilus就可以打开一个管理员权限的文件管理器,这个文件夹里找到HelloOS.bin选择复制到boot目录即可
最后重启机器,在加载页面按shift键选择我们的helloOS系统即可!