OS专题-了解MBR引导过程
OS专题-了解MBR引导过程
计算机上电启动后,首先运行主板BIOS程序,BIOS并不知道如何加载操作系统,所以BIOS把加载操作系统的任务交给引导扇区。因此,引导扇区必须放在一个已知的标准位置,这个位置就是磁盘的第一个扇区cylinder 0, head 0, sector 0
,该扇区一共占用512
字节。
为了确保”磁盘是可引导的”BIOS会检查扇区的第511
和512
字节是不是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