• boot引导升级,成功引导运行loader


    接上文:简单的boot引导的实现代码(内有详细注解,asm INT10的使用)_What’smean的博客-CSDN博客简单的boot引导的实现代码(内有详细注解,asm INT10的使用)https://blog.csdn.net/weixin_42492218/article/details/127665541?spm=1001.2014.3001.5501

            本文仅对boot中的内容进行更新实现引导loader的功能

            将下列代码代替原boot.asm(内涵部分注释)

    1. org 0x7c00
    2. BaseOfStack equ 0x7c00
    3. BaseOfLoader equ 0x1000
    4. OffsetOfLoader equ 0x00
    5. RootDirSectors equ 14
    6. SectorNumOfRootDirStart equ 19
    7. SectorNumOfFAT1Start equ 1
    8. SectorBalance equ 17
    9. jmp short Label_Start
    10. nop
    11. BS_OEMName db 'MINEboot'
    12. BPB_BytesPerSec dw 512
    13. BPB_SecPerClus db 1
    14. BPB_RsvdSecCnt dw 1
    15. BPB_NumFATs db 2
    16. BPB_RootEntCnt dw 224
    17. BPB_TotSec16 dw 2880
    18. BPB_Media db 0xf0
    19. BPB_FATSz16 dw 9
    20. BPB_SecPerTrk dw 18
    21. BPB_NumHeads dw 2
    22. BPB_HiddSec dd 0
    23. BPB_TotSec32 dd 0
    24. BS_DrvNum db 0
    25. BS_Reserved1 db 0
    26. BS_BootSig db 0x29
    27. BS_VolID dd 0
    28. BS_VolLab db 'boot loader'
    29. BS_FileSysType db 'FAT12 '
    30. Label_Start:
    31. mov ax, cs
    32. mov ds, ax
    33. mov es, ax
    34. mov ss, ax
    35. mov sp, BaseOfStack
    36. ;======= clear screen
    37. mov ax, 0600h
    38. mov bx, 0700h
    39. mov cx, 0
    40. mov dx, 0184fh
    41. int 10h
    42. ;======= set focus
    43. mov ax, 0200h
    44. mov bx, 0000h
    45. mov dx, 0000h
    46. int 10h
    47. ;======= display on screen : Start Booting......
    48. mov ax, 1301h
    49. mov bx, 000fh
    50. mov dx, 0000h
    51. mov cx, 10
    52. push ax
    53. mov ax, ds
    54. mov es, ax
    55. pop ax
    56. mov bp, StartBootMessage
    57. int 10h
    58. ;======= reset floppy
    59. xor ah, ah
    60. xor dl, dl
    61. int 13h
    62. ;======= search loader.bin
    63. mov word [SectorNo], SectorNumOfRootDirStart
    64. Lable_Search_In_Root_Dir_Begin:
    65. cmp word [RootDirSizeForLoop], 0
    66. jz Label_No_LoaderBin
    67. dec word [RootDirSizeForLoop]
    68. mov ax, 00h
    69. mov es, ax
    70. mov bx, 8000h
    71. mov ax, [SectorNo]
    72. mov cl, 1
    73. call Func_ReadOneSector
    74. mov si, LoaderFileName
    75. mov di, 8000h
    76. cld
    77. mov dx, 10h
    78. Label_Search_For_LoaderBin:
    79. cmp dx, 0
    80. jz Label_Goto_Next_Sector_In_Root_Dir
    81. dec dx
    82. mov cx, 11
    83. Label_Cmp_FileName:
    84. cmp cx, 0
    85. jz Label_FileName_Found
    86. dec cx
    87. lodsb
    88. cmp al, byte [es:di]
    89. jz Label_Go_On
    90. jmp Label_Different
    91. Label_Go_On:
    92. inc di
    93. jmp Label_Cmp_FileName
    94. Label_Different:
    95. and di, 0ffe0h
    96. add di, 20h
    97. mov si, LoaderFileName
    98. jmp Label_Search_For_LoaderBin
    99. Label_Goto_Next_Sector_In_Root_Dir:
    100. add word [SectorNo], 1
    101. jmp Lable_Search_In_Root_Dir_Begin
    102. ;======= display on screen : ERROR:No LOADER Found
    103. Label_No_LoaderBin:
    104. mov ax, 1301h
    105. mov bx, 008ch
    106. mov dx, 0100h
    107. mov cx, 21
    108. push ax
    109. mov ax, ds
    110. mov es, ax
    111. pop ax
    112. mov bp, NoLoaderMessage
    113. int 10h
    114. jmp $
    115. ;======= found loader.bin name in root director struct
    116. Label_FileName_Found:
    117. mov ax, RootDirSectors
    118. and di, 0ffe0h
    119. add di, 01ah
    120. mov cx, word [es:di]
    121. push cx
    122. add cx, ax
    123. add cx, SectorBalance
    124. mov ax, BaseOfLoader
    125. mov es, ax
    126. mov bx, OffsetOfLoader
    127. mov ax, cx
    128. Label_Go_On_Loading_File:
    129. push ax
    130. push bx
    131. mov ah, 0eh
    132. mov al, '.'
    133. mov bl, 0fh
    134. int 10h
    135. pop bx
    136. pop ax
    137. mov cl, 1
    138. call Func_ReadOneSector
    139. pop ax
    140. call Func_GetFATEntry
    141. cmp ax, 0fffh
    142. jz Label_File_Loaded
    143. push ax
    144. mov dx, RootDirSectors
    145. add ax, dx
    146. add ax, SectorBalance
    147. add bx, [BPB_BytesPerSec]
    148. jmp Label_Go_On_Loading_File
    149. ; Label_File_Loaded:
    150. ; jmp $
    151. ;======= read one sector from floppy
    152. Func_ReadOneSector:
    153. push bp
    154. mov bp, sp
    155. sub esp, 2
    156. mov byte [bp - 2], cl
    157. push bx
    158. mov bl, [BPB_SecPerTrk]
    159. div bl
    160. inc ah
    161. mov cl, ah
    162. mov dh, al
    163. shr al, 1
    164. mov ch, al
    165. and dh, 1
    166. pop bx
    167. mov dl, [BS_DrvNum]
    168. Label_Go_On_Reading:
    169. mov ah, 2
    170. mov al, byte [bp - 2]
    171. int 13h
    172. jc Label_Go_On_Reading
    173. add esp, 2
    174. pop bp
    175. ret
    176. ;======= get FAT Entry
    177. Func_GetFATEntry:
    178. push es
    179. push bx
    180. push ax
    181. mov ax, 00
    182. mov es, ax
    183. pop ax
    184. mov byte [Odd], 0
    185. mov bx, 3
    186. mul bx
    187. mov bx, 2
    188. div bx
    189. cmp dx, 0
    190. jz Label_Even
    191. mov byte [Odd], 1
    192. Label_Even:
    193. xor dx, dx
    194. mov bx, [BPB_BytesPerSec]
    195. div bx
    196. push dx
    197. mov bx, 8000h
    198. add ax, SectorNumOfFAT1Start
    199. mov cl, 2
    200. call Func_ReadOneSector
    201. pop dx
    202. add bx, dx
    203. mov ax, [es:bx]
    204. cmp byte [Odd], 1
    205. jnz Label_Even_2
    206. shr ax, 4
    207. Label_Even_2:
    208. and ax, 0fffh
    209. pop bx
    210. pop es
    211. ret
    212. ;======= tmp variable
    213. RootDirSizeForLoop dw RootDirSectors
    214. SectorNo dw 0
    215. Odd db 0
    216. ;======= display messages
    217. StartBootMessage: db "Start Boot"
    218. NoLoaderMessage: db "ERROR:No LOADER Found"
    219. LoaderFileName: db "LOADER BIN",0
    220. ;=========================
    221. Label_File_Loaded:
    222. jmp BaseOfLoader:OffsetOfLoader
    223. ;======= fill zero until whole sector
    224. times 510 - ($ - $$) db 0
    225. dw 0xaa55

     其他同上文。

    代码详解请看:

    完整boot引导代码详解(完整无注释代码boot.asm+简单loader.asm)_What’smean的博客-CSDN博客完整boot引导代码详解(完整无注释代码boot.asm+简单loader.asm)https://blog.csdn.net/weixin_42492218/article/details/127752246

            在原有基础上添加 loader.asm(简单的显示功能)

            loader.asm内容

    1. org 10000h
    2. mov ax,cs
    3. mov ds,ax
    4. mov es,ax
    5. mov ax,0x00
    6. mov ss,ax
    7. mov sp,0x7c00
    8. ;========== 显示 Start Loader....
    9. mov ax,1301h
    10. mov bx,000fh
    11. mov dx,0200h
    12. mov cx,12
    13. push ax
    14. mov ax,ds
    15. mov es,ax
    16. pop ax
    17. mov bp,StartLoaderMessage
    18. int 10h
    19. jmp $
    20. ;=============
    21. StartLoaderMessage : db "Start Loader"

            对loader.asm进行下列操作:

    nasm loader.asm -o loader.bin

            当loader.asm程序编译结束后,必须将生成的二进制程序loader.bin复制到虚拟软盘镜像文件boot.img中。此处的复制过程与boot.bin程序的写入过程采用了完全不同方法,当boot.bin程序写入到boot.img虚拟软盘镜像文件后,boot.img虚拟软盘已经拥有了FAT12文件系统,那么应该借助挂载命令mount和复制命令cp,把引导加载程序loader.bin复制到文件系统中。

            整个复制过程需要执行以下命令:

    1. mount boot.img /media/ -t vfat -o loop 挂载 目录 -t vfat 指定磁盘文件系统
    2. cp loader.bin /media/ 复制到文件系统
    3. sync //强制同步命令
    4. umount /media/ //卸载目录

    然后运行引导成功即可:

    具体运行请参考:在Linux下安装配置bochs,并成功跑一个简单的boot引导(超详细)_What’smean的博客-CSDN博客

  • 相关阅读:
    今天虚竹哥又发现了一款好用的国产化API工具
    ActivityStackSupervisor、ActivityStack、ActivityDisplay、TaskRecord、ActivityRecord
    创建线程并启动-创建线程的前三种方式
    【C++】【多线程(std::thread)】
    C++进阶(二)
    jmeter-登录用户数和线程数量的关系的爱恨情愁
    华秋电子余宁荣获2022年PCB行业先进科技工作者奖项
    如何使用Fiddler进行弱网测试
    我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
    linux常用操作(vim & SSH服务)
  • 原文地址:https://blog.csdn.net/weixin_42492218/article/details/127751460