bootloader

作者: VicX | 来源:发表于2016-04-16 10:14 被阅读173次

    出现的原因

    因为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

    相关文章

      网友评论

        本文标题:bootloader

        本文链接:https://www.haomeiwen.com/subject/ksonlttx.html