《操作系统真相还原》读书笔记六:让mbr使用硬盘

编写mbr.S代码

bash 复制代码
;LOADER_BASE_ADDR equ 0x900
;LOADER_START_SECTOR equ 0x2
%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
  
  mov ax,0x0600
  mov bx,0x0700
  mov cx,0
  mov dx, 184fh
  int 10h
  
  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
  
rd_disk_m_16:
  mov esi,eax
  mov di,cx
  
  mov dx,0x1f2
  mov al,cl
  out dx,al
  
  mov eax,esi
  
  mov dx,0x1f3
  out dx,al
  
  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
  or al,0xe0
  mov dx,0x1f6
  out dx,al

  mov dx,0x1f7
  mov al,0x20
  out dx,al

.not_ready:
  nop
  in al,dx
  and al,0x88

  cmp al,0x08
  jnz .not_ready

  mov ax,di
  mov dx,256
  mul dx
  mov cx,ax
  
  mov dx,0x1f0
.go_on_ready:
  in ax,dx
  mov [bx],ax
  add bx,2
  loop .go_on_ready
  ret
  
  times 510-($-$$) db 0
  db 0x55,0xaa 

编写boot.inc代码

bash 复制代码
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2

编写loader.S代码

bash 复制代码
;LOADER_BASE_ADDR equ 0x900
;LOADER_START_SECTOR equ 0x2
%include "boot.inc"

SECTION LOADER vstart=LOADER_BASE_ADDR
  
  mov byte [gs:0x00], '2'
  mov byte [gs:0x01], 0xA4
  
  mov byte [gs:0x02], ' '
  mov byte [gs:0x03], 0xA4
  
  mov byte [gs:0x04], 'L'
  mov byte [gs:0x05], 0xA4
  
  mov byte [gs:0x06], 'O'
  mov byte [gs:0x07], 0xA4
  
  mov byte [gs:0x08], 'A'
  mov byte [gs:0x09], 0xA4
  
  mov byte [gs:0x0a], 'D'
  mov byte [gs:0x0b], 0xA4
  
  mov byte [gs:0x0c], 'E'
  mov byte [gs:0x0d], 0xA4
  
  mov byte [gs:0x0e], 'R'
  mov byte [gs:0x0f], 0xA4
  
  jmp $
  
  
  

编译mbr.S,loader.S

bash 复制代码
nasm -I include/ -o mbr.bin mbr.S
dd if=/home/truthos/oscode/c3/b/boot/mbr.bin of=/home/truthos/bochs/hd60M.img bs=512 count=1 conv=notrunc

nasm -I include/ -o loader.bin loader.S
dd if=/home/truthos/oscode/c3/b/boot/loader.bin of=/home/truthos/bochs/hd60M.img bs=512 count=1 seek=2 conv=notrunc

启用bochs查看效果。

相关推荐
无奈笑天下4 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
Rabitebla8 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖12 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump12 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风14 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
少司府14 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
无足鸟ICT14 小时前
【RHCA+】IO调度算法
linux·服务器
wacsii15 小时前
【Linux进程(四)】命令行参数与环境变量
linux·服务器
无奈笑天下15 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
科研邪修法16 小时前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络