《一个64位操作系统的设计与实现》--BootLoader(1)

是按照参考书田宇著《一个64位操作系统的设计与实现》进行的,这里添加了一些操作步骤和说明。

一、写一个Boot引导程

写一个采用Intel汇编语言格式编写的Boot引导程序,命名为boot.asm,可以随便放在哪个路径。(程序中的汉字是我做的注释,用的时候删除即可)

将标识符    org    0x7c00          ;org是origin的英文缩写,意思是起始地址,制定程序的其实地址
BaseOfStack    equ    0x7c00    ;等价语句,赋值标识符

;这一段是引导程序的寄存器初始化部分,将CS寄存器的短地址设置到DS\ED\SS中,以及设置指针寄存器SP
Label_Start:
    mov    ax, cs
    mov    ds, ax
    mov    es, ax
    mov    ss, ax
    mov    sp, BaseOfStack  

;通过中断服务INT 10h实现屏幕信息显示相关操作。INT 10h中断服务要求在调用时,必须想AH寄存器传入服务程序的主功能编号
;=======    clear screen 上卷指定范围的窗口,INT 10h的主功能号AH=06h
    mov    ax, 0600h     ;AH是ax的高八位,AL是ax的低八位
    mov    bx, 0700h
    mov    cx, 0
    mov    dx, 0184fh
    int    10h
;=======    set focus设置屏幕光标位置,INT 10h的主功能号AH=02h

    mov    ax, 0200h
    mov    bx, 0000h  ;BH=页码
    mov    dx, 0000h  ;DH=游标的列数,DL=游标的行数
    int    10h
;=======    display on screen : Start Booting...... 显示一行字符串,INT 10h的主功能号AH=13h

    mov    ax, 1301h
    mov    bx, 000fh
    mov    dx, 0000h
    mov    cx, 10
    push   ax
    mov    ax, ds
    mov    es, ax
    pop    ax
    mov    bp, StartBootMessage
    int    10h
;=======    reset floppy  INT 13h,AH=00h功能:重置磁盘驱动器,为下一次读写软盘做准备
    xor    ah, ah
    xor    dl, dl
    int    13h

    jmp    $

    StartBootMessage:    db "Start Boot"

;=======    fill zero until whole sector

    times    510-($-$$) db 0  ;重复n次每次填充值为0,$代表该指令的地址,$$表示程序起始地址
    dw    0xaa55   ;结尾,必须为aa55

二、创建一个虚拟软盘镜像文件

使用Bochs自带工具bximage创建虚拟软盘镜像

在boochs安装路径下执行bximage

frui@Rui:~/learning/os-v1/bochs-2.6.9$ bximage
========================================================================
                                bximage
  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs
         $Id: bximage.cc 13069 2017-02-12 16:51:52Z vruppert $
========================================================================

1. Create new floppy or hard disk image
2. Convert hard disk image to other format (mode)
3. Resize hard disk image
4. Commit 'undoable' redolog to base image
5. Disk image info

0. Quit

Please choose one [0] 1

Create image

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create.
Please type 160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M, or 2.88M.
 [1.44M] 

What should be the name of the image?
[a.img] example.img

Creating floppy image 'example.img' with 2880 sectors

The following line should appear in your bochsrc:
  floppya: image="example.img", status=inserted

有几个选项,都已经复制过来了,首先会有个数字的选项,选择1:创建一个磁盘镜像文件。之后会选择磁盘镜像的类型,有硬盘hd和软盘fd两种选择,这里选择fd。之后进入软盘容量的选择,默认1.44MB,直接回车就好,这个容量对应的是最通用的3.5英寸软盘。确定软盘类型后给镜像文件命名,这里用example.img代替,我实际的取名是boot.img。到此一个镜像文件就设置完了。

这个镜像文件的设置是对应了bochs设置文件.bochsrc中的一些配置,以下是配置详情

floppya: type=1_44, 1_44=boot.img, status=inserted, write_protected=0
boot: floppy

这个确认下,如果不是,需要改过来,不然会影响后续的启动

三、在Bochs上运行Boot程序

首先先编译第一步的boot.asm文件

nasm boot.asm -o boot.bin

下一步,使用dd命令吧引导程序强制写入到引导扇区中

dd if=boot.bin of=(bochs安装路径)/boot.img bs=512 count=1 conv=notrunc

之后在bochs 安装路径下启动bochs,输入6,进入仿真器界面,此时完成硬件检测,之后再输入c/cont/continue中的任意一种,即可运行。

说明补充:bximage创建的镜像文件需要在bochs安装文件下,同时还需要配置文件.bochsrc也在同一路径下。

效果图如下:

(tips:ubuntu选区域截屏快捷键shift+prt,选区域截屏并复制到剪切板ctrl+shift+prt)

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值