OS专题-了解MBR引导过程

OS专题-了解MBR引导过程

计算机上电启动后,首先运行主板BIOS程序,BIOS并不知道如何加载操作系统,所以BIOS把加载操作系统的任务交给引导扇区。因此,引导扇区必须放在一个已知的标准位置,这个位置就是磁盘的第一个扇区cylinder 0, head 0, sector 0,该扇区一共占用512字节。

为了确保”磁盘是可引导的”BIOS会检查扇区的第511512字节是不是0xAA55。下面是最简单的可识别引导:

e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 省略29行,每行16个0字节(00) ]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

可以看到上面的代码基本上都是0,最后的两个字节是以0xAA55结束的。开头的三字节表示计算机进入一个无限循环。

我们来实现这个代码。现在我们创建一个项目,什么项目都可以(C或者C++的都行)。

创建完成以后,我们可以看到如下的目录结构:

os
├─.idea
├─cmake-build-debug
├─main.cpp
└─CMakeLists.txt

我们修改一下这个结构,使其变成这样:

os
├─.idea
├─cmake-build-debug
├─bin
├─boot
│   └─mbr.asm
└─CMakeLists.txt

下面我们要更改一下CMakeLists.txt这个文件,使其成为一个汇编项目。

cmake_minimum_required(VERSION 3.20)
project(os)

enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS asm)
set(CMAKE_ASM_NASM_OBJECT_FORMAT bin)
set(CMAKE_NASM_LINK_EXECUTABLE nasm)
set(CMAKE_ASM_NASM_FLAGS "-e")
set(CMAKE_ASM_NASM_LINK_EXECUTABLE "nasm <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> \
    <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

set_source_files_properties(boot/mbr.asm PROPERTIES LANGUAGE ASM_NASM)

add_executable(loader boot/mbr.asm)

set_target_properties(loader
        PROPERTIES
        SUFFIX .img)

mbr.asm文件中编写如下代码:

; 进入无限循环
loop:
    jmp loop
; 填充其他位的值为00
times 510-($-$$) db 0
; 魔数
dw 0xaa55

现在就可以编译项目了,点击菜单栏的Build -> Build Project后,你会在bin目录中看到一个镜像文件loader.img。打开Terminal,输入指令qemu bin/loader.img。即可启动写好的镜像。因为代码中只有一个循环,没有任何输出,所以只要你的虚拟机中光标在闪动且没有输出就说明成功了!


OS专题-了解MBR引导过程
https://blog.cikaros.top/doc/ddfee3ec.html
作者
Cikaros
发布于
2022年9月22日
许可协议