微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

未完待续…

原文地址:https://www.jb51.cc/react/307530.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐