今天看了极客时间操作系统实战的专栏,在实现简单内核(没有任何功能,只是打印出一句话)时也遇到了一些问题,这里记录一下。 这里不自己写引导汇编加载扇区的汇编代码,而是直接使用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
insmod ext2
set root='hd0,msdos4'
multiboot2 /boot/HelloOS.bin
boot
}
修改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系统即可!
|