01-1【实现boot中赋初值的功能】初始化引导程序


原理说明



Bios会加载第0扇区到内存中,只有512字节,因此该部分的程序无法做太多的事,因此需要扩展程序,有以下两种方式:

这里选用方式二,因为实现起来相对简单一点。



16位实模式的情况下,寄存器也是16位,详见下图右边的AX BX CX DX

  • 8086CPU的寻址范围是1MB

  • 确定物理地址的方法:
    CPU 访问内存单元时要给出内存单元的地址。
    所有内存单元构成的存储空间是一个一维的线性空间。
    每一个内存单元都有唯一的地址,叫物理地址。
    8086 有 20 位地址总线,可传送 20 位地址,寻址能力是 2^20 = 1 MB
    8086 是 16 位结构的 CPU,运算器一次最多处理 16 位的数据,寄存器的最大宽度为 16 位。
    在 8086 cpu内部处理的、传输、暂存的地址也是 16 位,寻址能力只有 64 KB

  • 如何处理地址总线 20 位的寻址能力受限于 16 位地址长度这一问题?
    用两个 16 位地址(段地址和偏移地址)合成一个 20 位的物理地址。
    地址加法器合成物理地址的方法: 物理地址 = 段地址 ∗ 16 + 偏移地址

  • 内存的分段表示法:
    内存并没有分段,段的划分来自于CPU


参考链接 :https://blog.csdn.net/AlwaysBeShine/article/details/137412067

实操


初始的start.S如下:


(1)先将寄存器的值置为0

(这里使用AT&T格式的汇编指令,另一种格式是intel格式)


编译后查看反编译文件,可以看到第一个扇区的最后两个字节的值,55和aa,说明第一个扇区中确实有引导代码,因此可以把第一扇区中的内容加载到内存中


(2)接着连接qemu调试一下


  • 按F5(调试快捷键)

  • 终端 运行任务 调试准备 继续而不扫描任务输出

  • 接着查看寄存器的值

  • 按F11可以进行单步操作,观察寄存器的值的变化

通过观察esp寄存器发现,esp寄存器的值不是0x7c00,经过检查发现是赋值的语句漏写了一个$,如下所示:

重新编译后调试,esp的值就正确了




posted @   卡卡发  阅读(17)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示