OpenBSD内核之引导MBR

  MBR的介绍网上很多,没错,就那个最后以0x55AA结尾的512字节的引导块,OpenBSD提供了引导MBR实现;OpenBSD在x86上的引导过程为MBR --> PBR --> boot --> kernel,其整体过程在boot_i386(8) (http://man.openbsd.org/OpenBSD-6.0/man8/i386/boot_i386.8)中有详细讲解,让我们直接上代码吧,MBR的代码在sys/arch/i386/stand/mbr/目录下,主要就是其中的mbr.S

  代码是AT&T格式的汇编,但开头的注释已经几乎将其功能介绍完了:

/*
 * Memory layout:
 *
 * 0x07C00 -> 0x07DFF    BIOS loads us here    (at  31k)
 * 0x07E00 -> 0x17BFC    our stack        (to  95k)
 *
 * 0x07A00 -> 0x07BFF    we relocate to here    (at  30k5)
 *
 * 0x07C00 -> 0x07DFF    we load PBR here    (at  31k)
 *
 * The BIOS loads us at physical address 0x07C00.  We use a long jmp to
 * normalise our address to seg:offset 07C0:0000.  We then relocate to
 * 0x07A00, seg:offset 07A0:0000.
 *
 * We use a long jmp to normalise our address to seg:offset 07A0:0000
 * We set the stack to start at 07C0:FFFC (grows down on i386)
 * The partition boot record (PBR) loads /boot at seg:offset 4000:0000
 */

  大概帮翻一下就是BIOS会将mbr.S加载到0x7C00处,然后mbr.S将自己复制并重定性到0x7A00处,然后将PBR加载到自己原来的位置0x7C00处,整个过程使用的栈在0x07E00 ~ 0x17BFC,然后jmp到PBR继续执行,PBR然后加载/boot到4000:0000,mbr.S是实模式程序,当然涉及到x86实模式的寻址方式,整个过程就是这样了。

  MBR虽然有510字节,但实际用户代码的只有400+字节,因为MBR里还包含一个分区表,分区在MBR末尾定义:

/* partition table */
/* flag, head, sec, cyl, type, ehead, esect, ecyl, start, len */
    . = DOSPARTOFF    /* starting address of partition table */
pt:
    .byte    0x0,0,0,0,0,0,0,0
    .long    0,0
    .byte    0x0,0,0,0,0,0,0,0
    .long    0,0
    .byte    0x0,0,0,0,0,0,0,0
    .long    0,0
    .byte    DOSACTIVE,0,1,0,DOSPTYP_OPENBSD,255,255,255
    .long    0,0x7FFFFFFF
/* the last 2 bytes in the sector 0 contain the signature */
    . = 0x1fe

  基本上就是每个分区的开始结束扇区、各种flag等信息,其中一个flag是表示是否为“活动分区”的,mbr.S执行是会检查这个标志,并将活动分区的第一个扇区(512字节)加载到0x7C00(MBR在开始执行时已经将自己从定位到0x7A00处了),然后jmp到0x7C00执行PBR。

  加载PBR也就是读磁盘,读磁盘可以使用传统的CHS模式或者LBA模式,通过int 13检测硬件是否支持LBA,否则回退到CHS模式操作,或者可以在启动时按住shift键强制使用CHS模式。

  另外还有一点,就是BIOS会在执行MBR前将引导的设备号放到DL寄存器中,第一块硬盘为0x80。

  OK,mbr.S的内容基本就这些了,代码还是相当清晰的,这就当个简单的笔记吧,熟悉的同学直接跳过这篇。

时间: 2024-08-10 21:20:37

OpenBSD内核之引导MBR的相关文章

OpenBSD内核之引导PBR

OpenBSD引导的第二部PBR,也是活动分区的一个扇区的代码,由第一步的MBR加载到0x7C00处,manpage里详细的讲解了过程和大致实现 biosboot(8) (http://man.openbsd.org/OpenBSD-6.0/man8/i386/biosboot.8),代码在sys/arch/i386/stand/biosboot/目录下,主要就是其中的biosboot.S:和mbr.S一样,在代码的开头清晰的介绍了该代码要做的事情: /* * Memory layout: *

linux内核启动引导过程

linux内核(uImage格式镜像,uImage = zImage_压缩的内核镜像 + 0x40字节大小的uboot格式信息头)的启动过程大体可以分为三个阶段: 第一:内核的自解压过程(汇编+C语言实现) 主要由.arch/arm/boot/compressed对zImage完成解压,并调用call_kernel跳转到下阶段代码. 第二:板级引导阶段(汇编实现) 主要进行cpu和体系结构的检查.cpu本身的初始化以及页表的建立等 第三:通用内核启动阶段(C语言实现:重点分析) 1. 进入ini

Linux内核的引导

1,当系统上电或复位时,CPU会将PC指针赋值为一个特定的地址0xFFFF0并执行该地址处的指令.在PC机中,该地址位于BIOS中,它保存在主板上的ROM或Flash中 2,BIOS运行时按照CMOS的设置定义的启动设备顺序来搜索处于活动状态并且可以引导的设备.若从硬盘启动,BIOS会将硬盘MBR(主引导记录)中的内容加载到RAM.MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区).当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR 3,主引导加载程序查找并

linux 驱动学习笔记03--Linux 内核的引导

如图所示为 X86 PC 上从上电/复位到运行 Linux 用户空间初始进程的流程.在进入与 Linux相关代码之间,会经历如下阶段. ( 1 ) 当系统上电或复位时, CPU 会将 PC 指针赋值为一个特定的地址 0xFFFF0 并执行该地址处的指令.在 PC 机中,该地址位于 BIOS 中,它保存在主板上的 ROM 或 Flash 中. ( 2) BIOS 运行时按照 CMOS 的设置定义的启动设备顺序来搜索处于活动状态并且可以引导的设备. 若从硬盘启动, BIOS 会将硬盘 MBR(主引导

修复开机引导MBR

输入命令:MbrFix /drive 0 fixmbr /yes 然后按回车键,如果出现“Function failed.Error 5.拒绝访问”,就进入C盘,找到MbrFix.exe,右击“属性”,出现属性对话框,切换到“兼容性”选项卡,将“以管理员身份运行此程序”勾起来.然后重新输入MbrFix /drive 0 fixmbr /yes按回车键

Linux 内核引导参数简介

概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明.大多数参数是通过"__setup(... , ...)"函数设置的,少部分是通过"early_param(..

mini2440 uboot使用nfs方式引导内核,文件系统

mini2440 uboot使用nfs方式引导内核,文件系统 成于坚持,败于止步 看了一段时间的u-boot了,到今天才真正完全实现u-boot引导内核和文件系统,顺利开机,在此记录完整过程 1.首先如果你u-boot还没有一直也没有关系,这里上传了一个已经移植好的u-boot,版本问2010.03,多谢tekkaman分享的这个源码 分享下载地址:u-boot-2010.03 编译uboot的过程就不在多说了,解压到你希望的目录下执行make,当时事前安装好交叉编译工具,这个相信大家都会 编译

linux 系统中多重操作系统引导管理器grub学习

注:以下学习均在X86架构的CPU下搭建完成的linux系统. 一.linux系统启动流程简介 POST开机自检-->加载BIOS-->读取MBR-->启动Boot Loader/Grub程序-->加载内核-->用户层init依据inittab文件来设定运行等级-->init进程执行rc.sysinit-->启动内核模块-->执行不同运行级别的脚本程序-->执行/etc/rc.d/rc.local-->执行/bin/login程序,进入登录状态

[Linux学习笔记] Linux系统引导流程(一)

前面我们已经介绍过以CentOS为例的Linux系统的安装以及Linux常用命令的使用,本节内容我们将介绍Linux系统引导流程.当按下电源的那一刻,到我们看到用户界面,这其中都发生了些什么呢?赶快来一探究竟. 下图为Linux系统引导流程过程图: 以下对Linux引导流程过程做一个简单的说明: 1. POST加电自检 POST(POST ON SELF TEST)首先对每一个设备进行检查,完成后会寻找存有引导记录的设备,找到读入操作系统的引导记录,将系统控制权交给引导记录. 2. MBR引导