bootloader

出现的原因

因为x86体系结构的CPU在启动时是在Real Mode下运行,而Real Mode只能寻址1M以内的内存(实际给代码的内存小于512K)。这么小的空间根本不可能容纳下现在的操作系统,因此Bootloader作为在Real Mode下执行的第一个程序,其最终目的就是为了将操作系统内核加载进内存、初始化执行化环境、并将控制流跳转到内核执行入口。

多阶段的Bootloader

如前文所述,因为Bootloader只能有小于512K的代码量,但是随着业务逻辑的复杂(如从不同的介质、不同的文件系统中加载内核),512K的空间根本不可能实现这么复杂的功能,因此也就有了多阶段的Bootloader。

实现一个Bootloader的要点

  1. 最重要的一点,既然作为一个loader,那么必须知道如何找到并读取被加载的内容。

  2. Loader工作的结束也就是内核工作的开始,因此必须为内核初始化必须的环境。

因为现在的内核都运行于Protected Mode之下,因此一般的BootLoader需要做以下工作:

  • 激活A20 Line

in al, 0x92

or al, 2

out 0x92, al

  • 进入保护模式(Protected Mode)

mov eax,cr0

or eax,1

mov cr0,eax

(If data selector is 10h, code selector is 8 and kernel offset is 10000h do,注意需要用far jump)

mov ax,10h

mov ds,ax

mov es,ax

mov fs,ax

mov gs,ax

mov ss,ax

jmp 8:10000h

  • (可选的)设置GDT

kernel会有自己的设置

利用Grub来加载自己的内核

http://wiki.osdev.org/GRUB#Installation_and_booting

http://www.jamesmolloy.co.uk/tutorial_html/2.-Genesis.html

http://etud.insa-toulouse.fr/~projet_tut_OS/w/Bochs_%2B_Grub

在mkfs时,要注意host os所支持的file system OSX 不能挂载ext2,所以如果用OSX来做实验,可以使用-t msdos格式。

注意使用root权限,否则可能没有读取/dev/loopN的权限

Mac OSX注意事项

  1. 没有loop设备,因此也没有losetup命令。可以在Ubuntu环境下制作镜像

  2. mkfs(Ubuntu)默认的文件格式是ext2,为了支持Mac的读写,需要指令文件系统类型为MAC支持的,如msdos

  3. MAC 下update_kernel.sh参考:

#!/bin/bash

hdiutil attach -mountpoint boot_folder boot.img

cp kernel boot_folder/

hdiutil detach boot_folder

    原文作者:VicX
    原文地址: https://www.jianshu.com/p/c2e36ade94f3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞