在软盘中安装grub
昨天在这一步出了点问题,很难受,今天来解决一下
我发现问题可能跟我使用的是腾讯云的vps有关,后来我换了一台vultr的centos的vps之后就没问题了,接着昨天的
用loop0把floppy.img虚拟成块设备
1 | sudo losetup /dev/loop0 floppy.img |
进入grub命令行
1 | sudo grub |
然后输入下面的命令
1 | device (fd0) /dev/loop0 |
然后解除loop0和floppy.img的关联,解除挂载
1 | sudo losetup -d /dev/loop0 |
现在软盘镜像就做好了,不过还没有内核,先来测试一下
1 | qemu -fda floppy.img -boot a |
看到grub的菜单界面就成功了
注意:如果用的是vps,那么ssh客户端一定要支持x11,不然虚拟机运行不了,因为虚拟机需要图形化界面,今天grub命令行和x11花了我大量的时间,摸索Google了半天,总算解决了2333,所以昨天就没更新bolg,内容太少了233
内核的入口
boot/boot.s
1 | ; ---------------------------------------------------------------- |
上面这段是汇编的代码,分号后面的是注释
7-22行定义了Multiboot规范要用到的一些值,Multiboot定义的Multiboot 头的分布必须如下表所示:
1 | 偏移量 类型 域名 备注 |
这里只用到了前三个,MBOOT_HEADER_MAGIC 就是标志头的魔数,必须等于0x1BADB002
MBOOT_HEADER_FLAGS 就是flag,一共32位,不同位置1有不同的含义,这里将0和1位置1了,代表的意义在注释上
MBOOT_CHECKSUM 就是checksum ,域checksum是一个32位的无符号值,当与其他的magic域(也就是magic和flags)相加时,结果必须是32位的无符号值0(即magic + flags + checksum = 0)。
43-45行定义了这三个数为32位,即4字节
51行的start就是链接器脚本定义的内核入口函数
start干的事情就是关中断,设置栈,然后将grub提供的信息的指针放到全局变量里面((按照协议,GRUB把一些计算机硬件和我们内核文件相关的信息放在了一个结构
体中,并且将这个结构体指针放在了ebx寄存器中)
最后调用c语言写的函数kern_entry,这个函数返回后就是hlt待机了
65行到最后定义了未初始化的一些空间,定义了栈大小为32768字节,glb_mboot_ptr指针为4字节,定义了栈顶的地址
init/entry.c
汇编写完了,现在可以来写c语言啦
1 | int kern_entry() |
这个就是上面汇编调用的c的函数,函数啥也没干233
include/types.h
1 | #ifndef INCLUDE_TYPES_H_ |
这个就是做了一些宏定义,并且把c语言的一些类型名字做了重命名
现在的目录结构是这样的:
现在我们来启动试试看
1 | make |
先看到grub的菜单,然后选择操作系统之后就啥也不干了,毕竟我们啥也没写233
今天就先结束了,成完成了一个啥也不做的内核2333