加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:45:20 所属栏目:百科 来源:网络整理
导读:计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录(MBR),MBR再搜索系统的活动分区表,加载活动分区表的第一个扇区到一个固定的地址。MBR接下来将控制权交给PBR,PBR解析FAT或NTFS格式文件系统,找到引导内核的文件NTLDR,将该

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

原版的启动源码是一段汇编程序,这段汇编程序的路径大概是在“bootfreeldrbootsectdosmbr.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

未完待续…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读