1. 什么是 Bootloader?
Bootloader 是一种启动加载程序,用于开机自检之后,加载操作系统。它是计算机系统中的重要环节,也是 Linux 操作系统必不可少的部分。
Bootloader 的主要作用:
检查硬件设备
初始化内核
加载操作系统
2. Linux 操作系统下有哪些常用的 Bootloader?
Linux 操作系统下有许多 Bootloader 可供选择。以下介绍几种常用的 Bootloader。
2.1 GRUB2
GRUB2 是 GNU 组织开发的 Bootloader,它是多系统引导的最佳选择。
GRUB2 的特点:
灵活性好
支持多操作系统
支持多硬盘引导
支持多种文件系统
以下是 GRUB2 的示例代码:
menuentry "Fedora (4.18.5-300.fc29.x86_64)" {
linux /vmlinuz-4.18.5-300.fc29.x86_64 root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet LANG=zh_CN.UTF-8
initrd /initramfs-4.18.5-300.fc29.x86_64.img
}
2.2 LILO
LILO 是很早期的 Bootloader,现已经被淘汰,但仍有很多用户在使用它。
LILO 的特点:
可靠性高
加载速度快
不依赖于 BIOS
以下是 LILO 的示例代码:
image=/boot/vmlinuz-2.4.20-8
label=linux
initrd=/boot/initrd-2.4.20-8.img
read-only
root=/dev/hdc1
3. Bootloader 的启动过程
当计算机开机时,BIOS 会执行 POST(Power-On Self Test) 自检程序,并在硬件检查完成后,尝试从 Bootloader 启动计算机。
3.1 BIOS 自检
计算机开机后,BIOS 会执行 POST 自检程序,检查硬件设备是否正常。如果其中有任何一个硬件设备出现了问题,BIOS 会储存在 CMOS 内存的错误信息,并提示用户修复相关问题后重启计算机。如果所有硬件设备都正常,BIOS 便会
尝试从 Bootloader 启动操作系统。
以下是 BIOS 自检部分的示例代码:
//Test main memory
if(TstCMOS_wChecksum() == 0xA0) msgOK( CKPM_OK, "M*");
else {
msgBad( CKPM_ERR, "M*"); cold_reset();
//
//At this point, no message will be displayed, so the failure will be silent
//
}
//Now test the video subsystem
if(TstVram() == 0x0) msgOK( CKPM_OK, "V*");
else {
msgBad( CKPM_ERR, "V*"); cold_reset();
}
3.2 Bootloader 启动
在 BIOS 自检完成后,BIOS 会尝试从可引导设备的第一个扇区读取 Bootloader。如果找到了 Bootloader,BIOS 会将控制权交给 Bootloader,使其开始加载操作系统。
以下是 Bootloader 启动部分的示例代码:
// Load kernel image file
void load_kernel_image( void )
{
kernel_file = fopen( KERNEL_FILE_NAME, "rb" );
get_image_size();
read_header();
mmap_at( KERNEL_LOAD_ADDR, kernel_size, PROT_READ | PROT_WRITE );
FILE* fp = kernel_file;
for ( size_t i = 0 ; i < kernel_size ; ) {
size_t chunk_size = READ_CHUNK_SIZE;
if ( i + chunk_size > kernel_size ) {
chunk_size = kernel_size - i;
}
size_t rv = fread( ((char*)KERNEL_LOAD_ADDR) + i, sizeof(char), chunk_size, fp );
if ( rv <= 0 ) {
panic( "load_kernel_image: Early EOF" );
}
i += rv;
}
}
4. Bootloader 的重要性
Bootloader 是操作系统的“启动之父”,用于加载操作系统内核。由于它与计算机系统的启动过程紧密相关,并且是操作系统必不可少的环节,因此可判定其在计算机系统中扮演了至关重要的角色。
Bootloader 的重要性:
开机自检之后的第一道程序
加载操作系统内核
兼容多种硬盘,支持多重引导操作系统
5. 结论
以上就是关于 Bootloader 的讲解。Bootloader 在计算机系统中扮演的角色非常重要,无论是在 Linux 操作系统还是其他操作系统中。有了这篇文章的讲解,相信你对 Bootloader 的理解已更为深刻。