zoukankan      html  css  js  c++  java
  • boot and loader

    boot and loader

    boot 程序的所有作用

    • 清屏
    • 将光标移到屏幕左上角
    • 显示 Start Boot 提示信息
    • 加载 loader 程序的代码到 0x10000 物理内存地址
    • 将CPU的段地址设置为 0x1000, 偏移量为 0x0000

    boot 程序(内置 FAT12 文件系统的引导扇区的信息)的编写

    • 注意boot不能实现FAT12文件系统, 因为boot的要求是512B, 但是使用FAT12文件系统的前提是有引导扇区的信息, 所以在boot定义好, 到时都我们要将我们的软盘格式化成FAT12文件系统

    • 第一行 org 0x7c00, 告诉CPU指令CS和IP的值

    • 初始化DS, ES, SS, SP, 其中SP为0x7c00

    • 填写 FAT12 的引导数据

    • 注意:

      • 写完一部分如果要测试的话需要加上jmp $让程序一直运行才行否则不会有任何的显示
      • 在汇编中有函数和标签两个概念, 我们一般这样规定, 函数使用call指令调用, 在该函数中我们要开辟一个新的栈, 如果要为cx等寄存器赋值的话, 需要将他们的值保存起来, 放到栈中, 在函数结束之前回复cx等寄存器中的值; 而标签使用jmp, jz等指令执行, 他们不需要必须保存cx等值, 而是视需求而定, 一般来说函数为模块, 而标签为流程
      • 每一个Label结束之后都应该添加一个跳转jmp指令, 使得程序执行的流程清晰
      • boot的大小只有512B, 所以要注意编程的时候注意代码量, 能把程序写的简单就程序写的短一点
      • 将软盘中的数据读取到内存中是查找filename和加载loader的前提, 并且除了loader都是加载到0000h:8000h, 约定俗称并且有很多书上都是这样写的, 可以参考, 毕竟汇编本来就很难了还难以调试
      • 在读取sector, 要回滚则使用and di, 0ffeh, 注意这里di的起始值为8000h, 看到8000h就应该觉得和读取到内存有关系了, 假如有一个循环, 每循环一次都会inc di, 但是到了一个条件之后, 我们需要跳出循环并且将di回到原来的8000h, 怎么办? 这时就是一个汇编技巧了, 也是一个数学技巧吧, 反正我打算把它记住的, and di, 0ffe0h, 则di的值就成为了8000h, 该技巧控制的范围是20h(十进制就是32), 如果di为8020h, 则and一下di的值还是8020h, 这个技巧在读取目录项的item很有用(item一个32b)
    • 读取sector取出数据判断是否匹配filename, 如果匹配则加载loader的数据, 最后将CS:IP设置成1000:0000地址(loader的内存地址)

    loader 程序

    作用
    • 通过BIOS的中断获取硬件信息, 加载内核到内存1MB以上内存地址空间, BIOS的功能调用需要在real mode下, 而内核运行在protected mode下, 所以使用需要在real mode将内核放到1MB地址空间以上的位置, 但是BIOS的寻址只有1MB, 也就是说BIOS读取数据会放到1MB之下, 所以要想将内核代码放到1MB之上, 我们需要一个临时的内核地址空间0x7e00, 现将数据放到0x7e00的内存地址, 再将数据复制到1MB之上

    • 通过A20快速门开启实模式下的4G物理内存寻址, 这个是为了兼容老式机器而遗留下来的历史问题, 默认计算机是不会开启A20快速门, 通过0x92端口获取数据到al, or al, 000000010b置位, out 0x92, al开启A20功能号

    • 完成 real mode --> protected mode --> IA-e32 mode(64位保护模式, IA表示Long Mode)

    • 关闭外部中断, 临时开启保护模式设置fs寄存器再关闭保护模式, 开启外中断即可在real mode下实现4G内存寻址, 称之为Big Real Mode

    注意

    1MB地址表示为100000h

  • 相关阅读:
    mysql排序对空值的处理
    Lambda表达式要点
    nginx Provisional headers are shown
    JAVA使用POI如何导出百万级别数据(转)
    idea 自定义注释模板
    idea使用配置
    Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:
    Java HotSpot(TM) 64-Bit Server VM warning
    dubbo-admin管理平台搭建
    zookeeper安装
  • 原文地址:https://www.cnblogs.com/megachen/p/9726845.html
Copyright © 2011-2022 走看看