zoukankan      html  css  js  c++  java
  • 操作系统:实现引导扇区

    电脑在启动时,在BIOS启动自检后,检查并将引导扇区加载到7c00h处,跳转到7c00h开始执行代码。

    0. 使用的工具

    建议先看完本文,再选择安装。

    1. 引导扇区代码

        org 07c00h          ; 告诉编译器将程序加载到7c00h处
        mov ax, cs          ; 取代码段段地址,此时应该为0
        mov ds, ax          ; 让数据段与代码段地址指向相同地址
        mov es, ax          ; 让附加段es与代码段地址指向相同地址
        call DispStr        ; 调用DispStr例程
        jmp $               ; 无限循环,$ 表示编译后当前行指令地址
    DispStr:                ; 例程DispStr,显示一行字符串
        mov ax, BootMessage ; 取字符串首地址
        mov bp, ax          ; CPU使用ES:BP寻址字符串
        mov cx, 16          ; 将字符串长度放入 CX
        mov ax, 01301h      ; AH = 13h表示输出字符串 AL = 01h写模式,01h表示字符串
                            ; 中仅包含字符,不包括字符属性,写完更新光标位置
        mov bx, 000ch       ; BH = 0h页数为0 BL表示字符串属性,0CH表示黑底红字
        mov dl, 0           ; 显示位置,DH表示行,DL表示列
        int 10h             ; 调用BOIS中断10H
        ret
    BootMessage:        db  "Hello, MN world!"  ; 定义字符串 db表示define byte
    times   510-($-$$)  db  0   ; 填充剩余空间 $$表示该程序所在section的开始地址
                                ; 此处为7c00h
    dw  0xaa55              ; 扇区结束标志,如果已0xAA55结束,BIOS认为是一个合法
                            ; 的引导扇区,dw表示define word
    
    
    引导扇区长度一般长度为512字节。


    2. 编译

    上述的代码编译后生成512字节大小的二进制文件。编译命令:

    nasm boot.asm -o boot.bin

    然后打算以软盘的形式加载并执行这段代码,软盘采用1.44M大小的盘,BIOS的会检查软盘的0面0磁道1扇区,如果是引导扇区,即以0xaa55结束,就加载它。那么就需要将boot.bin写到软盘的第一个扇区。使用作者提供的FloppyWriter完成上述工作,得到Finix.img文件,如下:

    -rw-r--r--. 1 root root 1474560 Sep  9 13:56 Finix.img

    3. 运行

    使用两种方式来运行它,分别使用Virtualbox和Bochs来运行。

    3.1 Virtualbox

    使用Virtualbox 5.0.2新建一个类型和版本都为Other类型的系统,内存32M,硬盘1G就足够用了。然后配置从软盘启动:


    接着设置软盘的加载上述的Finix.img文件。


    接着启动系统,运行结果:


    3. 2 使用Bochs来运行

    安装Boch 2.6.8。然后在Finix.img文件同目录新建一个文件Finix.bxrc,接着将如下内容写入到Finix.bxrc中:

    ###############################################################
    # bochsrc.bxrc file for Finix.
    ###############################################################
    
    # how much memory the emulated machine will have
    megs: 32
    
    # filename of ROM images
    romimage: file=$BXSHARE/BIOS-bochs-latest
    vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
    
    # what disk images will be used 
    floppya: 1_44=Finix.IMG, status=inserted
    
    # choose the boot disk.
    boot: a
    
    # where do we send log messages?
    log: bochsout.txt
    
    # disable the mouse, since Finix is text only
    mouse: enabled=0
    
    # enable key mapping, using US layout as default.
    keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map
    

    不出意外双击Finix.bxrc即可运行,结果如下:


    虽然显示了很多其他的信息,但我们知道上面的代码已经可以运行了。

    如果配置过程出现了问题可以参考:http://blog.csdn.net/furzoom/article/details/52484413


    4. 参考

    于渊《自己动手写操作系统》

    Writing 16-bit Code http://web.mit.edu/gnu/doc/html/as_18.html#SEC209

    BIOS INT 10H调用 http://www.ctyme.com/intr/int-10.htm

    Wiki INT 10H https://en.wikipedia.org/wiki/INT_10H

    INT 10H 的13H参数说明 http://blog.csdn.net/pdcxs007/article/details/43378229

    关于INT 10H 13H的更多应用 http://www.cnblogs.com/ljf9201314/archive/2008/07/21/1247653.html

    INT 10H 13H说明 http://www.itzhai.com/assembly-int-10h-description.html


  • 相关阅读:
    Redis --- 客户端 --- Another Redis Desktop Manager
    Docker --- 记录安装与使用过程中遇到的问题
    Docker安装教程
    Python --- pip --- No module named 'pip'异常问题
    天气接口测试用例生成报告
    jsonpath使用
    python小知识,字典
    python小知识,列表推导式
    python小知识,sort和serted的区别
    如何查看app启动的activity
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710231.html
Copyright © 2011-2022 走看看