当前位置:主页 > 查看内容

操作系统真象还原实验记录之实验一:第一次编写mbr

发布时间:2021-07-14 00:00| 位朋友查看

简介:操作系统真象还原之实验一第一次编写mbr 对应书中第2.3节让mbr飞一会 第58页 1.相关基础知识提炼总结 1.1电脑开机前与后 在电脑未开机前BIOS就被加载到内存的F0000~FFFFF中。此区域为ROM MBR被加载到磁盘的0盘0道1扇区CHS方式 CHS 方式中扇区的编号是从1开始……

操作系统真象还原之实验一:第一次编写mbr

对应书中第2.3节:让mbr飞一会 第58页

1.相关基础知识提炼总结

1.1电脑开机前与后

在这里插入图片描述
在电脑未开机前,BIOS就被加载到内存的F0000~FFFFF中。此区域为ROM
MBR被加载到磁盘的0盘0道1扇区(CHS方式)
CHS 方式中扇区的编号是从1开始的
当电脑按下power键后,cs:ip会被强制置为F000:FFF0 ,所以cpu会执行内存地址FFFF0处的指令。
FFFF0处的指令为跳转指令jmp far f000:e05b。
跳转后,BIOS便马不停蹄地检测内存、显卡等外设信息,当检测通过,并初始化好硬件后,开始在内存中 0x000~0x3FF处建立数据结构,中断向量表 IVT 并填写中断例程。
BIOS 最后一项工作校验启动盘中位于0盘0道1扇区的内容。
如果此扇区末尾的两个字节分别是魔数0x55和0xaa,就会把该扇区内容加载到内存地址 0x7c00处,
然后执行跳转指令jmp 0: 0x7c00

2.实验记录

2.1 实验目的

编写mbr.s程序,该程序可以在显示屏打印字段。将该程序加载到磁盘的0盘0道1扇区,使用bochs模拟,确保当计算机执行完BIOS后可以执行mbr.s,在显示屏打印字段。

2.2 实验代码

; mbr.S

; 主引导程序
; --------------------------------------------------

SECTION MBR vstart=0x7c00 ; 把起始地址编译为 0x7c00
    mov ax, cs     ; cs 代码段寄存器
    mov ds, ax     ; dx 数据段寄存器
    mov es, ax     ; es 附加段寄存器
    mov ss, ax     ; ss 堆栈段寄存器
    mov fs, ax     ; fs 80386 后添加的寄存器,无全称
    mov sp, 0x7c00 ; sp 堆栈指针寄存器

; 清屏
; --------------------------------------------------
; INT 0x10    功能号: 0x06    功能描述:上卷窗口
; --------------------------------------------------
; 输入:
; AH 功能号 = 0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL, CH) = 窗口左上角的 (X, Y) 位置
; (DL, DH) = 窗口右下角的 (X, Y) 位置
; 无返回值:
    mov ax, 0x600
    mov bx, 0x700
    mov cx, 0
    mov dx, 0x184f ; 右下角: (80, 25)
                   ; VGA 文本模式种,一行只能容纳 80 个字符,共 25 行
                   ; 下标从 0 开始,所以 0x18=24, 0x4f=79
        
    int 0x10       ; int 0x10

;;;;;;;;;;;;;下面这三行代码获取光标位置;;;;;;;;;;;;;;;;

; .get_cursor 获取当前光标位置,在光标处打印字符
    mov ah, 3      ; 3 号子功能
    mov bh, 0      ; 待获取光标的页号

    int 0x10       ; 输出:
                   ; ch = 光标开始行,cl = 光标结束行
                   ; dh = 光标所在行号,dl = 光标所在列号

; 打印字符串
    mov ax, message
    mov bp, ax     ; es:bp 为串首地址
    
    mov cx, 5      ; cx 为串长度,不包括结束符 '\0'
    mov ax, 0x1301 ; 13 号子功能
                   ; ah = 13
                   ; al = 01: 写字符方式,显式字符串,光标跟随移动
    mov bx, 0x2    ; bh = 0,要显示的页号
                   ; bl = 02,字符属性,黑底绿字
    
    int 0x10
;;;;;;;;;;;;;;;;;;;;;;打印字符串结束;;;;;;;;;;;;;;;;
jmp $;     程序悬停在此

message db "1 MBR"
times 510-($-$$)   db 0
db 0x55,0xaa

2.3实验流程

0.创建硬盘,命名Seven.img

./bximage -mode=create  -imgmode=flat -hd=60 -q Seven.img

效果图
在这里插入图片描述

注:此命令和书上不同,因为环境版本不同 -size会报错。
输入命令

./bximage  --help

可查看自己环境支持的命令
效果图
在这里插入图片描述

1.找到文件目录,点击在终端中打开,使用命令

nasm -o mbr.bin mbr.s  

将mbr.s编译成mbr.min。

2.将mbr.bin刻入磁盘第0块(LBA方式)命令为

dd if=/你的mbr.bin的路径/mbr.bin of=/你的自定义硬盘的路径/自定义硬盘名称 bs=512 count=1 seek=0 conv=notrunc

比如我自己的

dd if=/home/Seven/bochs2.68/bin/mbr.bin of=/home/Seven/bochs2.68/bin/Seven.img bs=512 count=1 seek=0 conv=notrunc

3.用bochs进行模拟

输入命令

./bochs -f bochsrc.disk  

然后输入c继续。

2.4实验结果

在这里插入图片描述

;原文链接:https://blog.csdn.net/mxy990811/article/details/115548385
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:2021南京大学软件学院考研经验 下一篇:没有了

推荐图文


随机推荐