实现一个最简单的内核

今天看了极客时间操作系统实战的专栏,在实现简单内核(没有任何功能,只是打印出一句话)时也遇到了一些问题,这里记录一下。
在这里插入图片描述
这里不自己写引导汇编加载扇区的汇编代码,而是直接使用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系统即可!
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值