zoukankan      html  css  js  c++  java
  • bootsect及setup

     

    BIOS和bootsect

    CPU加电即进入16位实模式
    硬件逻辑设计为加电瞬间强行设置:CS=0xF000,IP=0xFFF0,CS:IP=0xFFFF0
    而BIOS程序的入口地址即0xFFFF0,是计算机上电后CPU执行的第一条指令的地址
     
     
    BIOS程序在内存中加载中断向量表和中断服务程序
     
    调用INT 0x19中断,将软盘第一扇区(0面0磁道1扇区)的512字节即bootsect.s加载到内存0x07C00处
     
    bootsect.s将自身复制到0x90000~0x90200,ds:si -> es:di
    rep指令重复256次,一次复制4字节即双字,复制结束后便跳过去,跳时指定了段和偏移(段内偏移实际没变)
     
    调用INT 0x13中断,将setup.s对应的程序加载到0x90200处,共四个扇区2K
    再通过INT 0x13中断,将system加载到0x10000
    检查根设备
    然后跳到setup.s的第一行指令
     
    可见,bootsect主要完成的是搬运加载工作
     

    setup

    setup程序的第一件事是利用BIOS中断服务程序将机器系统数据加载在原bootsect的位置(覆盖),0x90000~0x901FD,在setup前只空了2个字节
    关中断,将system从0x10000复制到0x00000
     
    设置全局描述符表(将来存放LDT和TSS)以及中断描述符表,GDT -> GDTR,IDT -> IDTR,注:setup.s从0x92000开始,gdt段内偏移相对0x90000要加上512
    打开A20,实现32位寻址
    建立保护模式下的中断机制,设置中断控制器8259A,保留内部不可屏蔽中断0x00~0x1F,重新映射中断号,IRQ0为0x20
    将控制寄存器CR0的第0位PE置1,打开保护模式(之后要根据GDT)
    跳到GDT的1项指向的地址开始执行,即head.s
     
    参考:《Linux内核设计的艺术》
     



  • 相关阅读:
    避免陷阱,重写Equals方法您需要注意的其中2个原则
    lucene入门资源汇总
    lucene vs zoie
    实时搜索的五个开源解决方案
    常用的数据标准化方法
    使用lucene实现社会化搜索
    openquery跨服务器传输数据
    错误:5061,ALTER DATABASE 失败
    Errore HTTP 404.2 Not Found
    DevExpress ASP.NET ASPxGridView使用方法大全
  • 原文地址:https://www.cnblogs.com/shine-lee/p/4470514.html
Copyright © 2011-2022 走看看