美文网首页
第3章 完善MBR实验

第3章 完善MBR实验

作者: mecury | 来源:发表于2018-05-21 22:51 被阅读87次
  • 直接使用显卡显示内容

直接使用显卡显示内容

  1. nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ ll
total 8
-rw-rw-r--. 1 haifei haifei  512 May 14 19:39 mbr.bin
-rw-rw-r--. 1 haifei haifei 1054 May 14 19:38 mbr.S

  1. 生成hd60M.img
[haifei@localhost bochs-2.6.2]$ bximage -hd -mode="flat" -size=60 -q hd60M.img
========================================================================
                                bximage
                  Disk Image Creation Tool for Bochs
          $Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================

I will create a 'flat' hard disk image with
  cyl=121
  heads=16
  sectors per track=63
  total sectors=121968
  total size=59.55 megabytes

The disk image 'hd60M.img' already exists.  Are you sure you want to replace it?
Please type yes or no. [no] yes

Writing: [] Done.

I wrote 62447616 bytes to hd60M.img.

The following line should appear in your bochsrc:
  ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63

  1. 将mbr.bin目录追加到hd60M.img
[haifei@localhost bochs-2.6.2]$ dd if=/home/haifei/bochs2.6.2/bochs-2.6.2/systemCode/c3/a/boot/mbr.bin of=/home/haifei/bochs2.6.2/bochs-2.6.2/hd60M.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000139165 s, 3.7 MB/s

3.启动bochs

bochs -f .bochsrc
SECTION MBR vstart=0x7c00
    mov ax, cs  ;使用cs的值去初始化其他寄存器。由于BIOS是通过jmp 0: 0x7c00调转到MBR上的,cs此时为0
    mov dx, ax
    mov es, ax
    mov ss, ax
    mov fs, ax
    mov sp, 0x7c00  ;初始化栈指针
    mov ax, 0xb800  ;显存文本模式,栈指针
    mov gs, ax  ;将段基址写入到gs寄存器中

    
;清屏
;利用0x06功能号,上卷全部行,则可清屏
;AH 功能号=0x06
;AL 上卷的行数(如果为0,则为全部)
;BH 上卷的行属性
;(CL,CH)=窗口左上角的(X,Y)位置
;(DL,DH)=窗口右下角的(X,Y)位置
    mov ax, 0600h   
    mov bx, 0700h
    mov cx, 0
    mov dx, 184fh
    
    int 10h     ;系统中断
    
    mov byte [gs:0x00], '1'
    mov byte [gs:0x01], 0xA4  ;A表示绿色背景闪烁,4表示前景色为红色
    
    mov byte [gs:0x02], ' '
    mov byte [gs:0x03], 0xA4
    
    mov byte [gs:0x04], 'M'
    mov byte [gs:0x05], 0xA4
    
    mov byte [gs:0x06], 'B'
    mov byte [gs:0x07], 0xA4
    
    mov byte [gs:0x08], 'R'
    mov byte [gs:0x09], 0xA4

    jmp $   ;通过死循环使程序悬停在这里

    times 510-($-$$) db 0
    db 0x55,0xaa 

由硬盘读取数据

[haifei@localhost boot]$ cat include/boot.inc 
;------------loader与kernel-----------------
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2

编译

nasm -I include/ -o loader.bin loader.S 
;主引导程序
;---------------------------------------
%include "boot.inc"  
    SECTION MBR vstart=0x7c00  
            mov ax,cs  
            mov ds,ax  
            mov es,ax  
            mov ss,ax  
            mov fs,ax  
            mov sp,0x7c00  
            mov ax,0xb800  
            mov gs,ax  
      
;清屏
;利用0x06号功能,上卷全部行,则可清屏
;--------------------------------------
;INT 0x10 功能号:0x06  功能描述:清屏
;--------------------------------------
            mov ax,0x600  
            mov bx,0x700  
            mov cx,0  
            mov dx,0x184f  
      
            int 0x10  
      
;A表示绿色背景闪烁,4表示前景色为红色
            mov byte [gs:0x00],'1'  
            mov byte [gs:0x01],0xA4  
      
            mov byte [gs:0x02],''  
            mov byte [gs:0x03],0xA4  
      
            mov byte [gs:0x04],'M'  
            mov byte [gs:0x05],0xA4  
      
            mov byte [gs:0x06],'B'  
            mov byte [gs:0x07],0xA4  
      
            mov byte [gs:0x08],'R'  
            mov byte [gs:0x09],0xA4  
      
            mov eax,LOADER_START_SECTOR     ;起始扇区地址  
            mov bx,LOADER_BASE_ADDR         ;写入的地址
            mov cx,1                ;待读入的扇区数
            call rd_disk_m_16           ;以下读取程序的起始部分(一个扇区)
      
            jmp LOADER_BASE_ADDR  
      
;----------------------------------------------
;功能:读取硬盘n个扇区
;----------------------------------------------
    rd_disk_m_16:  
;eax=LBA扇区号
;bx=将数据写入的内存地址
;cx=待读入的扇区数
            mov esi,eax     ;备份eax  
            mov di,cx       ;备份cx
      
;读写硬盘
;第一步:设置读取的扇区数
            mov dx,0x1f2  
            mov al,cl  
            out dx,al       ;读取的扇区数
            mov eax,esi     ;恢复ax
      
;第二步:将LBA地址存入0x1f3 ~ 0x1f6
       ;LBA地址7~0位写入0x1f3
            mov dx,0x1f3  
            out dx,al  
      
    ;LBA地址15~8位写入端口0x1f4
            mov cl,8  
            shr eax,cl  
            mov dx,0x1f4  
            out dx,al  
      
            shr eax,cl  
            mov dx,0x1f5  
            out dx,al  
      
            shr eax,cl  
            and al,0x0f  
            out dx,al  
      
            shr eax,cl  
            mov dx,0x1f5  
            out dx,al  
      
            shr eax,cl  
            and al,0x0f     ;lba第24-27位
            or al,0xe0      ;设置7-4位为1110,表示lba模式
            mov dx,0x1f6  
            out dx,al  
      
;第三步:向0x1f7端口写入读命令,0x20
            mov dx,0x1f7  
            mov al,0x20  
            out dx,al  

;第四步:检测硬盘状态      
            not_ready:  
                    nop  
                    in al,dx  
                    and al,0x88  
                    cmp al,0x08  
                    jnz not_ready  
      
;第五步:从0x1f0端口读数据
            mov ax,di  
            mov dx,256  
            mul dx  
            mov cx,ax  
            mov dx,0x1f0  
      
            go_on_read:  
                    in ax,dx  
                    mov [bx],ax  
                    add bx,2  
                    loop go_on_read  
                    ret  
      
            times 510-($-$$) db 0  
            db 0x55,0xaa  

相关文章

  • 第3章 完善MBR实验

    直接使用显卡显示内容 直接使用显卡显示内容 nasm -o mbr.bin mbr.S 生成hd60M.img 将...

  • 学习

    今天完善了TCP实验

  • MBR与GPT分区简述

    MBR 主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区。MBR下的硬盘分区有三...

  • 26周末(6.21-6.27)一周的今天最最好

    本周的主题是事业。实验室验收是政治任务,本周几乎所有的时间都在完善实验室相关资料。 为投票努力整理实验室硬件完善P...

  • 修复磁盘MBR分区

    MBR

  • 利用 parted 命令创建 GPT 分区(大容量)

    一、MBR 和 GPT 区别 1.1 MBR MBR分区表(即主引导记录)大家都很熟悉,是过去我们使用window...

  • 创建分区MBR方式(Master Boot Record)2T以

    创建分区MBR方式(Master Boot Record)2T以下的硬盘用MBR。2T以上的硬盘没有办法用MBR分...

  • MBR

    以下均为在 Intel 8086 处理器中的内容。 计算机的加电和复位 有两种情况处理器会执行一个硬件初始化,以及...

  • MBR

    MBR: 主引导记录。Main Boot Record. 主引导记录是位于磁盘最前面的一段引导(Loader)代码...

  • 控制器操作

    ISZ Xt1: MAR <- (IRaddress)t2: MBR <- (memory)t3: MBR ...

网友评论

      本文标题:第3章 完善MBR实验

      本文链接:https://www.haomeiwen.com/subject/usfddftx.html