ReactOS源码分析——内核加载器一

计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录(MBR),MBR再搜索系统的活动分区表,加载活动分区表的第一个扇区到一个固定的地址。MBR接下来将控制权交给PBR,PBR解析FAT或NTFS格式文件系统,找到引导内核的文件NTLDR,将该文件加载到0x20000。最后将控制权交给NTLDR进行内核启动。

原版的启动源码是一段汇编程序,这段汇编程序的路径大概是在“\boot\freeldr\bootsect\dosmbr.asm”。

我这里参考的源码不是原版ReactOS,这里的参考源码是源于《Windows内核设计思想》作者陈树宝改写的精简版BMR启动源码。我查看了原版DOSMBR代码,它的代码更加接近于Windows XP的启动逻辑。陈树宝的版本更加易于理解。下面给出陈树宝的代码片段:

start:
    cli             ; 关中断,将标志寄存器中的中断标志位清零,禁止中断;
    xor  ax,ax     ; 异或运算,两个操作数相同,即清零运算;
    mov  ss,ax     ; 设置栈段寄存器,段寄存器清零;
    mov  sp,7c00h  ; 设置栈顶,栈顶为0x7C00;
    sti             ; 开中断,将标志寄存器中的中断标志位置1,开启中断;

    push 07c0h
    pop ds
    mov  ax,07c0h  ; 设置数据段寄存器
    mov  ds,ax

    ; 加载NTLDR
    push  dword 80000h/512-8  ; count - ntldr扇区总数,80000h / 512 - 8 = 0x3F8
    push  dword 8             ; src - 开始读取的扇区号
    push  dword 20000h        ; des - 存放数据的目的地址
    call  LoadSector          ; 加载扇区

    ;ntfsboot jmp 0x2000:0000,fatboot jmp 0x2000:0003
    push  word 2000h
    push  word 0000h 
o16 retf

未完待续…

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...