1.boot.asm源码开发,编写一个能加载loader的boot。

root@ubuntu:~# vi boot.asm
 org 0x7c00  BaseOfStack equ 0x7c00BaseOfLoader  equ 0x1000
OffsetOfLoader  equ 0x00RootDirSectors  equ 14
SectorNumOfRootDirStart equ 19
SectorNumOfFAT1Start    equ 1
SectorBalance   equ 17  jmp short Label_StartnopBS_OEMName  db  'MINEboot'BPB_BytesPerSec dw  512BPB_SecPerClus   db  1BPB_RsvdSecCnt dw  1BPB_NumFATs    db  2BPB_RootEntCnt dw  224BPB_TotSec16 dw  2880BPB_Media   db  0xf0BPB_FATSz16 dw  9BPB_SecPerTrk  dw  18BPB_NumHeads  dw  2BPB_HiddSec    dd  0BPB_TotSec32   dd  0BS_DrvNum  db  0BS_Reserved1   db  0BS_BootSig db  0x29BS_VolID    dd  0BS_VolLab  db  'boot loader'BS_FileSysType   db  'FAT12   'Label_Start:mov ax, csmov   ds, axmov   es, axmov   ss, axmov   sp, BaseOfStack;=======  clear screenmov ax, 0600hmov    bx, 0700hmov    cx, 0mov    dx, 0184fhint   10h;=======  set focusmov    ax, 0200hmov    bx, 0000hmov    dx, 0000hint    10h;=======  display on screen : Start Booting......mov  ax, 1301hmov    bx, 000fhmov    dx, 0000hmov    cx, 10push  axmov   ax, dsmov   es, axpop   axmov   bp, StartBootMessageint 10h;=======  reset floppyxor ah, ahxor   dl, dlint   13h;=======  search loader.binmov    word    [SectorNo], SectorNumOfRootDirStartLable_Search_In_Root_Dir_Begin:cmp   word    [RootDirSizeForLoop],   0jz Label_No_LoaderBindec   word    [RootDirSizeForLoop]    mov ax, 00hmov  es, axmov   bx, 8000hmov    ax, [SectorNo]mov   cl, 1call   Func_ReadOneSectormov   si, LoaderFileNamemov   di, 8000hcldmov dx, 10hLabel_Search_For_LoaderBin:cmp   dx, 0jz Label_Goto_Next_Sector_In_Root_Dirdec   dxmov   cx, 11Label_Cmp_FileName:cmp    cx, 0jz Label_FileName_Founddec cxlodsb cmp al, byte    [es:di]jz   Label_Go_Onjmp  Label_DifferentLabel_Go_On:inc  dijmp   Label_Cmp_FileNameLabel_Different:and   di, 0ffe0hadd   di, 20hmov  si, LoaderFileNamejmp   Label_Search_For_LoaderBinLabel_Goto_Next_Sector_In_Root_Dir:add    word    [SectorNo], 1jmp    Lable_Search_In_Root_Dir_Begin;=======   display on screen : ERROR:No LOADER FoundLabel_No_LoaderBin:mov ax, 1301hmov    bx, 008chmov    dx, 0100hmov    cx, 21push  axmov   ax, dsmov   es, axpop   axmov   bp, NoLoaderMessageint  10hjmp  BaseOfLoader:OffsetOfLoader;=======  found loader.bin name in root director structLabel_FileName_Found:mov   ax, RootDirSectorsand   di, 0ffe0hadd   di, 01ahmov cx, word    [es:di]push cxadd   cx, axadd   cx, SectorBalancemov    ax, BaseOfLoadermov es, axmov   bx, OffsetOfLoadermov   ax, cxLabel_Go_On_Loading_File:push axpush  bxmov   ah, 0ehmov  al, '.'mov    bl, 0fhint  10hpop  bxpop   axmov   cl, 1call   Func_ReadOneSectorpop   axcall  Func_GetFATEntrycmp ax, 0fffhjz Label_File_Loadedpush   axmov   dx, RootDirSectorsadd   ax, dxadd   ax, SectorBalanceadd    bx, [BPB_BytesPerSec]jmp    Label_Go_On_Loading_FileLabel_File_Loaded:jmp   $;=======    read one sector from floppyFunc_ReadOneSector:push  bpmov   bp, spsub   esp,    2mov    byte    [bp - 2],   clpush  bxmov   bl, [BPB_SecPerTrk]div  blinc   ahmov   cl, ahmov   dh, alshr   al, 1mov    ch, aland   dh, 1pop    bxmov   dl, [BS_DrvNum]
Label_Go_On_Reading:mov ah, 2mov    al, byte    [bp - 2]int 13hjc   Label_Go_On_Readingadd  esp,    2pop    bpret;=======    get FAT EntryFunc_GetFATEntry:push  espush  bxpush  axmov   ax, 00mov   es, axpop   axmov   byte    [Odd],  0mov    bx, 3mul    bxmov   bx, 2div    bxcmp   dx, 0jz Label_Evenmov   byte    [Odd],  1Label_Even:xor dx, dxmov   bx, [BPB_BytesPerSec]div    bxpush  dxmov   bx, 8000hadd    ax, SectorNumOfFAT1Startmov cl, 2call   Func_ReadOneSectorpop   dxadd   bx, dxmov   ax, [es:bx]cmp  byte    [Odd],  1jnz    Label_Even_2shr ax, 4Label_Even_2:and   ax, 0fffhpop    bxpop   esret;=======    tmp variableRootDirSizeForLoop  dw  RootDirSectors
SectorNo        dw  0
Odd         db  0;=======    display messagesStartBootMessage:   db  "Start Boot"
NoLoaderMessage:    db  "ERROR:No LOADER Found"
LoaderFileName:     db  "LOADER  BIN",0;=======    fill zero until whole sectortimes   510 - ($ - $$)  db  0dw 0xaa55

2.重新编译boot.asm,生成boot.bin二进制文件。

root@ubuntu:~# nasm boot.asm -o boot.bin

3.重新把boot.bin二进制文件写进boot.img软盘里面。

root@ubuntu:~# dd if=boot.bin of=boot.img  bs=512 count=1 conv=notrunc

4.启动bochs测试boot功能。

root@ubuntu:~# bochs -f bochsconfig
========================================================================Bochs x86 Emulator 2.6.9Built from SVN snapshot on April 9, 2017Compiled on Mar 28 2019 at 10:03:12
========================================================================
00000000000i[      ] LTDL_LIBRARY_PATH not set. using compile time default '/usr/local/lib/bochs/plugins'
00000000000i[      ] BXSHARE not set. using compile time default '/usr/local/share/bochs'
00000000000i[      ] lt_dlhandle is 0x1253220
00000000000i[PLUGIN] loaded plugin libbx_usb_common.so
00000000000i[      ] lt_dlhandle is 0x1253ba0
00000000000i[PLUGIN] loaded plugin libbx_unmapped.so
00000000000i[      ] lt_dlhandle is 0x12543a0
00000000000i[PLUGIN] loaded plugin libbx_biosdev.so
00000000000i[      ] lt_dlhandle is 0x1254ce0
00000000000i[PLUGIN] loaded plugin libbx_speaker.so
00000000000i[      ] lt_dlhandle is 0x1255ad0
00000000000i[PLUGIN] loaded plugin libbx_extfpuirq.so
00000000000i[      ] lt_dlhandle is 0x1256310
00000000000i[PLUGIN] loaded plugin libbx_parallel.so
00000000000i[      ] lt_dlhandle is 0x1257f20
00000000000i[PLUGIN] loaded plugin libbx_serial.so
00000000000i[      ] lt_dlhandle is 0x125c2d0
00000000000i[PLUGIN] loaded plugin libbx_iodebug.so
00000000000i[      ] reading configuration from bochsconfig
------------------------------
Bochs Configuration: Main Menu
------------------------------This is the Bochs Configuration Interface, where you can describe the
machine that you want to simulate.  Bochs has already searched for a
configuration file (typically called bochsrc.txt) and loaded it if it
could be found.  When you are satisfied with the configuration, go
ahead and start the simulation.You can also start bochs with the -q option to skip these menus.1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit nowPlease choose one: [6] 6

因为还没有加载loader.bin,所以会打印报错信息。

5.编写loader.asm源码

org  10000hmov   ax, csmov   ds, axmov   es, axmov   ax, 0x00mov ss, axmov   sp, 0x7c00;=======   display on screen : Start Loader......mov   ax, 1301hmov    bx, 000fhmov    dx, 0200h       ;row 2mov   cx, 12push  axmov   ax, dsmov   es, axpop   axmov   bp, StartLoaderMessageint   10hjmp  $;=======    display messagesStartLoaderMessage: db  "Start Loader"

6.编译源码loader.asm, 生成loader.bin二进制文件

root@ubuntu:~# nasm loader.asm -o loader.bin

7.加载loader.bin到boot.img的软盘中。

root@ubuntu:~# mount boot.img /media/ -t vfat -o loop
root@ubuntu:~# cp loader.bin /media/
root@ubuntu:~# sync
root@ubuntu:~# umount /media/

8.重新运行bochs虚拟机。

root@ubuntu:~# bochs -f bochsconfig

9. Ctrl + C ===》exit ,退出bochs虚拟机

------------------------------------------------------------------------------------------

预留

《一个64位操作系统的设计与实现》学习实践3-boot加载loader相关推荐

  1. 一个64位操作系统的设计与实现 源代码,效果图

    一个64位操作系统的设计与实现 源代码 相关下载:https://download.csdn.net/download/qq_35540932/10588541?utm_source=bbsseo 一 ...

  2. 2018/11/29 一个64位操作系统的设计与实现 02 (安装nasm)

    操作系统: Centos7 在nasm官网上的到通过yum安装nasm的方法 首先在/etc/yum.repos.d/目录下 新建一个名为nasm.repo的文件, 在这么文件中写入内容如下 : [n ...

  3. 2018/11/29 一个64位操作系统的设计与实现 03 (在Bochs上运行Boot程序)

    使用命令dd强制将引导程序boot.bin写入引导扇区: dd if=boot.bin of=/home/parallels/Documents/bochs-2.6.9/boot.img bs=512 ...

  4. 一个64位操作系统的实现

    也许这只是一本书,也许这只是一堆代码,但更可能会帮助你了解.领悟计算机操作系统原理. 什么是操作系统?计算机相关专业的读者们在大学时候都会有<操作系统>这门课程,但是在课上老师讲的大多数内 ...

  5. oracle10 64位odbc,图文教你64位win10添加oracle odbc驱动时提示无法加载oracle如何解决...

    现在电脑已成为我们工作生活的一部分,相信大家在操作电脑时一定会遇到这样那样的问题,64位win10添加oracle odbc驱动时提示无法加载oracle如何解决这个问题就是我们经常会遇到的,这样的问 ...

  6. 64位 regsrv win10_Win10手动注册注册表提示regsvr32加载控件失败解决方案

    regsvr32加载控件失败怎么办?当我们在使用计算机时,有时候会发现有些注册表没有注册,需要手动进行注册,但是在cmd命令中,输入命令regsvr32 xx.dll,运行提示模块数据加载失败,这怎么 ...

  7. IE8浏览器32位被360篡改为64位(OCX控件在web页面不能加载的问题)

    OCX控件在web页面不能加载的问题 IE8浏览器32位被360篡改为64位 解决办法: 除了在ie浏览器自定义项中设置启用,将C:\Program Files\Internet Explorer下的 ...

  8. 32位和64位操作系统的区别

    简单的说x86代表32位操作系统 x64代表64位操作系统.如果你的CPU是双核以上,那肯定支持64位操作系统了.如果你的电脑内存大于4G,那就要用64位的系统了,因为32位的Windows 7也好, ...

  9. 一台计算机有64,在同一台计算机上使用带有32位和64位Altium设计软件的数据库元件库...

    数据库元件库(DbLibs)是一种流行且强大的元器件管理解决方案.但是,将Microsoft Access用作元器件的后端数据库时,使用Altium设计软件的32位和64位版本之间有一个重要区别: 6 ...

最新文章

  1. Matlab与数据结构 -- 对矩阵的排序
  2. 【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
  3. Keras保存和载入训练好的模型和参数
  4. 众筹网02_项目环境搭建
  5. zendframework配置篇
  6. android交互功能,Android 用户界面交互---拖放(OnDragListener)
  7. 用Emacs编写mybatis
  8. django学习之路
  9. maven启动web服务报错原因
  10. 差速齿轮原理_减速箱差速器行星轮圆柱销失效分析
  11. 2009年4月21日 博客更新公告,敬请关注!
  12. ArrayList的add方法值被覆盖(android项目)
  13. vue 点击取消按钮关闭页面_vue 点击按钮弹窗,点击关闭按钮关闭弹窗。
  14. 【转载】批量维护(创建/修改)客户主数据函数 SD_CUSTOMER_MAINTAIN_ALL BP自定义屏幕 数据维护
  15. 【UCOSii源码解析】事件控制块
  16. jersey tomcat MySQL_基于jersey和Apache Tomcat构建Restful Web服务(一)
  17. 【爬虫】王者荣耀爬取英雄高清4K图片
  18. STM32 TIM高级定时器死区时间的计算
  19. 前端切图之svg图标的复用基于defs和use 亲测有用
  20. Elasticsearch 查询时 判断不为null或不为空字符串

热门文章

  1. CorelDRAW 2020Mac、2021mac 版本正式回归 macOS免激活版
  2. python 绘制旭日图
  3. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
  4. 移动端处理输入法表情
  5. 题解:单词排序(水)
  6. 小木虫论坛-学术科研互动平台 爬虫
  7. 调试spi转can芯片MCP2518和can芯片MCP2542FD
  8. win10 oracle怎样卸载,怎么完全卸载Oracle?(Win10) 以Oracle 11g为例
  9. 微信 IOS系统 安卓时间格式
  10. 在C语言二级考试中编程题编译,二级C语言上机编程题