• 自制OS1-1到2-11==BIOS MBR loader


    2-11 从硬盘引导(五):突破512字节与寄存器段寻址再认识_哔哩哔哩_bilibili

    安装ORACLE VIRTUAL BOX

    解压nasm2

    使用diskpart命令 生成虚拟磁盘vdh

    diskpart

     create vdisk file=e:\dingst.vhd maximum=10 type=fixed

    编写汇编文件:指定寄存器的初始状态,以及输出的初始信息

     

    1. org 07c00h
    2. mov ax,cs
    3. mov ds,ax
    4. mov es,ax
    5. call Disp
    6. jmp $
    7. Disp:
    8. mov ax,BootMsg
    9. mov bp,ax
    10. mov cx,16
    11. mov ax,01301h
    12. mov bx,000ch
    13. mov dl,0
    14. int 10h
    15. BootMsg:db "Hello, OS World!"
    16. times 510 - ($-$$) db 0
    17. dw 0xaa55

     然后用nasm2编译汇编文件,

    然后用dd.exe读取编译后的文件将其中记录的相关操作执行到虚拟磁盘中。

    nasm E:\hello.asm -o E:\boot.bin

    1. E:\>dd if=boot.bin of=dingst.vhd bs=512 count=1
    2. rawwrite dd for windows version 0.5.
    3. Written by John Newbigin <jn@it.swin.edu.au>
    4. This program is covered by the GPL. See copying.txt for details
    5. 1+0 records in
    6. 1+0 records out

     写入虚拟磁盘之后,用虚拟机加载虚拟磁盘

    下一步选择注册刚才创建的虚拟磁盘。启动。成功看到了输出语句hello

    =====================================================================

    BIOS

    在操作系统运行之前,是BIOS在管理机器。

    BIOS将操作系统拉入内存。

    BIOS是固化在硬盘上的程序。

    BIOS是谁加载的?

            计算机被强制设置成开机后首先强制从物理地址FFFFF加载BIOS。

            BIOS会自动去读取每个磁盘的MBR。MBR只有512个字节。

    BIOS被加载到哪里? 

     

     BIOS会去扫描磁盘的0盘0道的第一个扇区的前512个字节,我们刚才编译后的文件就是通过dd.exe写到了hello.vhd这个虚拟磁盘的前512个字节中。BIOS强制规定了磁盘的0盘0道第1个扇区为可引导扇区,且最后必须以0xaa55结尾,否者这个磁盘不能被成功加载。如果可以被加载,就将这512个字节加载到BIOS专用物理地址的7C00及之后的地址。

    =======================================================

    操作 文本模式的显示适配器

     

     实现加载时候在屏幕输出黑底白字的字母I

    1. mov ax,0xb800 ;指向文本模式的显存缓冲区
    2. mov es,ax
    3. mov byte [es:0x00],'I'
    4. mov byte [es:0x01],0x07
    5. jmp $
    6. times 510-($-$$) db 0
    7. db 0x55,0xaa
    1. E:\nasm2>nasm e:\disp.asm -o disp.bin
    2. E:\nasm2>cd ..
    3. E:\>dd.exe if=disp.bin of=dingst.vhd
    4. rawwrite dd for windows version 0.5.
    5. Written by John Newbigin <jn@it.swin.edu.au>
    6. This program is covered by the GPL. See copying.txt for details
    7. 1+0 records in
    8. 1+0 records out
    9. E:\>dd.exe if=disp.bin of=dingst.vhd bs=512 count=1
    10. rawwrite dd for windows version 0.5.
    11. Written by John Newbigin <jn@it.swin.edu.au>
    12. This program is covered by the GPL. See copying.txt for details
    13. 1+0 records in
    14. 1+0 records out
    15. E:\>

    1. mov ax,0xb800 ;指向文本模式的显存缓冲区
    2. mov es,ax
    3. mov byte [es:0x00],'I'
    4. mov byte [es:0x01],0x07
    5. mov byte [es:0x02],'K'
    6. mov byte [es:0x03],0x07
    7. times 510-($-$$) db 0
    8. dw 0xaa55

      ====================================================

    CPU寄存器梳理

    16位的寄存器

    寻址方式:

     硬盘原理:

    操作硬盘的步骤:

    执行超过512字节的代码

    BIOS去拉mbr,mbr中有命令叫将loader加载到 0x900位置

    编写mbr.asm和loader.asm,分别编译,将mbr放入扇区0,将loader放入扇区2,

    1. ;引导程序。能够将第二个扇区里的内容加载进入内存
    2. ;mbr.asm放在扇区0, loader.asm
    3. ;将loader放入物理地址0x900处,这是BIOS允许使用的地址
    4. LOADER_BASE_ADDR equ 0x900 ;将loader放入物理地址0x900处,这是BIOS允许使用的地址
    5. LOADER_START_SECTOR equ 0x2 ;表示以LBA方式,我们的loader存在第二块扇区
    6. SECTION MBR vstart=0x7c00
    7. mov ax,cs
    8. mov ds,ax
    9. mov es,ax
    10. mov ss,ax
    11. mov fs,ax
    12. mov sp,0x7c00
    13. mov ax,0xb800 ;显存位置 指向文本模式的显存缓冲区
    14. mov gs,ax
    15. ;利用0x06的功能,调用10号中断,清理屏幕。查手册可知
    16. ; AH = 0x06
    17. ; AL = 0表示全部都要清除
    18. ; BH = 上卷行的属性
    19. ;(CL,CH) 左上角x,y
    20. ;(DL,DH) 右下角
    21. mov ax, 0600h
    22. mov bx, 0700h
    23. mov cx,0
    24. mov dx,184fh
    25. int 10h
    26. ;屏幕打印输出方便我们查看,输出一句话表明我们在mbr中
    27. mov byte [gs:0x00],'1'
    28. mov byte [gs:0x01],0xA4
    29. mov byte [gs:0x02],' '
    30. mov byte [gs:0x03],0xA4
    31. mov byte [gs:0x04],'M'
    32. mov byte [gs:0x05],0xA4
    33. mov byte [gs:0x06],'B'
    34. mov byte [gs:0x07],0xA4
    35. mov byte [gs:0x08],'R'
    36. mov byte [gs:0x09],0xA4
    37. ;从MBR去加载我们存在第二扇区的loader,并将loader放入物理地址0x900处,这是BIOS允许使用的地址
    38. mov eax,LOADER_START_SECTOR ;从这个地址读
    39. mov bx,LOADER_BASE_ADDR ;要写入的地址
    40. mov cx,1 ;表明要读几个扇区
    41. call rd_disk
    42. jmp LOADER_BASE_ADDR ;跳到要存的实际物理地址,待会要讲loader写入这个地址
    43. rd_disk:
    44. mov esi,eax ;备份eax
    45. mov di,cx
    46. ;读写硬盘
    47. mov dx, 0x1f2
    48. mov al,cl
    49. out dx,al
    50. mov eax,esi
    51. ;将LBA的地址存入0x1f3 0x1f6
    52. mov dx,0x1f3
    53. out dx,al
    54. mov cl,8
    55. shr eax,cl
    56. mov dx,0x1f4
    57. out dx,al
    58. shr eax,cl
    59. mov dx,0x1f5
    60. out dx,al
    61. shr eax,cl
    62. and al,0x0f
    63. or al,0xe0
    64. mov dx,0x1f6
    65. out dx,al
    66. ;向0x1f7写入读命令
    67. mov dx,0x1f7
    68. mov al,0x20
    69. out dx,al
    70. ;检测硬盘状态
    71. .not_ready:
    72. nop
    73. in al,dx
    74. and al,0x88
    75. cmp al,0x08
    76. jnz .not_ready
    77. ;读取数据
    78. mov ax,di
    79. mov dx,256
    80. mul dx
    81. mov cx,ax
    82. mov dx,0x1f0
    83. .go_on:
    84. in ax,dx
    85. mov [bx],ax
    86. add bx,2
    87. loop .go_on
    88. ret
    89. times 510-($-$$) db 0
    90. dw 0xaa55
    1. LOADER_BASE_ADDR equ 0x900
    2. section loader vstart=LOADER_BASE_ADDR
    3. mov ax,0xb800 ;指向文本模式的显存缓冲区
    4. mov es,ax
    5. mov byte [es:0x00],'O'
    6. mov byte [es:0x01],0x07
    7. mov byte [es:0x02],'K'
    8. mov byte [es:0x03],0x07
    9. jmp $
    1. E:\nasm2>nasm e:\mbr.asm -o mbr.bin
    2. E:\>dd if e:\mbr.bin of=e:\dingst.vhd bs=512 count=1
    3. E:\nasm2>nasm e:\loader.asm -o e:\loader.bin
    4. E:\nasm2>cd ..
    5. E:\>dd if=loader.bin of=dingst.vhd bs=512 count=1 seek=2
    6. rawwrite dd for windows version 0.5.
    7. Written by John Newbigin <jn@it.swin.edu.au>
    8. This program is covered by the GPL. See copying.txt for details
    9. 0+1 records in
    10. 0+1 records out
    11. E:\>

     

  • 相关阅读:
    python项目开发常用的目录结构
    6.2.2 基于ZIP文件安装MySQL
    Linux【工具 03】Telnet服务安装使用(安全性较差 非特殊情况尽量不要使用)
    SQL语句创建数据库
    Docker
    Unity获取脚本的CustomEditor(自定义编辑)数据
    响应式精美列表商城卡密自动发卡源码
    分享一个基于微信小程序的社区生活小助手源码调试和lw,有java+python双版本
    Linux环境搭建Jenkins(详细图文)
    [linux] 安装WEB服务器(tomcat),环境是32位
  • 原文地址:https://blog.csdn.net/hebian1994/article/details/126455956