《操作系统真相还原》读书笔记六:让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查看效果。

相关推荐
lightqjx8 小时前
【Linux系统】程序地址空间(初识)
linux·页表·地址空间
wljy18 小时前
二、线程操作
linux·线程属性·线程操作
mounter6258 小时前
探索未来 AI 算力网络的基石:从传统 RoCE 走向 SRv6 驱动的弹性弹性网络(解析 Netdev 0x1A 创新实践)
linux·网络·人工智能·linux kernel·kernel·rdma·rocev2
x_x-F9 小时前
深入浅出 Linux 网络核心:sk_buff 的内存与指针流转
linux·运维·网络
潘正翔19 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
weigangwin19 小时前
agent-workspace-linux 不是远程桌面:Linux AI 工作区的隔离边界验收
linux·xvfb·mcp·桌面隔离·权限边界·bubblewrap·agent-workspace
Dovis(誓平步青云)21 小时前
远程办公软件文件传输实测:6 款工具的速度、稳定性和办公体验对比
linux·运维·服务器·后端·生成对抗网络
Java小白笔记21 小时前
Docker 安装配置完全指南:MacOS 、Windows、Linux环境下的安装、配置与验证
linux·macos·docker
qetfw1 天前
CentOS 7 搭建 LDAP 目录服务
linux·运维·centos
ALINX技术博客1 天前
【黑金云课堂】FPGA技术教程Linux开发:系统进阶-PS DMA
linux·fpga开发