手写操作系统(二)-引导扇区

代码、内容参考来自于包括《操作系统真象还原》、《一个64位操作系统的设计与实现》以及《ORANGE’S:一个操作系统的实现》。

在上一篇我们完成了基本的环境搭建。 这里来个基本的引导扇区测试一下。

1.创建虚拟磁盘

diskpart 命令解释器可帮助管理计算机的驱动器(磁盘、分区、卷或虚拟硬盘)。 基本用法: https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/diskpart 这里我们创建一个创建虚拟磁盘

diskpart

回车

创建

create vdisk file=e:\OS\dingst.vhd maximum=10 type=fixed

用于在 Windows 系统中创建一个固定大小的虚拟硬盘文件(VHD),具体解释如下:

  • vdisk:表示正在操作虚拟磁盘。
  • file=e:\OS\dingst.vhd:指定了新建的虚拟硬盘文件的路径和名称,即 dingst.vhd 将被创建在 E:\OS\ 目录下。
  • maximum=10:表示这个虚拟硬盘文件的最大大小是 10GB。这个参数对于固定大小的虚拟硬盘(type=fixed)是必须的,它指定了虚拟硬盘文件的容量上限。
  • type=fixed:表示创建的虚拟硬盘是一个固定大小的虚拟硬盘。固定大小的虚拟硬盘在创建时会立即占据物理空间,即使实际使用的空间较小,也不会释放。

对目录下生成文件

 

2.引导程序

全部代码

然后打开编译器

org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call Disp
jmp $
Disp:
    mov ax,EchoBootMsg
    mov bp,ax
    mov cx,24
    mov ax,01301h
    mov bx,000ch
    mov dl,0
    int 10h
EchoBootMsg: db "Hello,This is Dreams OS!"
times 510 - ($-$$) db 0
dw 0xaa55

 

代码解释

一个简单的引导扇区(boot sector)程序,通常用于操作系统或引导加载程序的开头部分。 org 指令告诉汇编器将代码定位到物理地址 0x7c00 处,这是 BIOS 将从磁盘加载引导扇区的标准地址。

org 07c00h

 

这几行代码将代码段寄存器 CS 的值加载到数据段寄存器 DS 和附加段寄存器 ES 中。在实模式下,这通常用于确保程序可以正确访问数据段和额外段。

用CS指向代码的开始位置,用DS指向数据段的开始位置

mov ax, cs
mov ds, ax
mov es, ax

 

调用 Disp 过程

call Disp

 

$ 表示当前地址,jmp $ 会导致程序无限循环执行当前地址处的指令,这里用来在引导加载程序中用来防止代码执行完后系统自动退出。

jmp $

 

Disp 过程显示一条消息到屏幕上。具体操作如下:

  • mov ax, EchoBootMsg 将消息的地址加载到 ax 寄存器中。
  • mov bp, ax 将 ax 中的地址加载到 bp 寄存器中,作为消息的地址指针。
  • mov cx, 24 设置要显示的字符数为 24。
  • mov ax, 01301h 设置视频服务功能号为 0x13,表示”写字符串”功能。
  • mov bx, 000ch 设置视频模式为 0x0c(一种文本模式)。
  • mov dl, 0 设置显示器号为 0。
  • int 10h 执行视频服务中断,将消息显示在屏幕上。

 

下面的EchoBootMsg就是我们要显示的消息: “Hello, This is Dreams OS!”。

EchoBootMsg: db "Hello, This is Dreams OS!"

 

引导扇区末尾:

times 510 – ($-$$) db 0 填充代码和数据段直到达到引导扇区的大小,保证整个引导扇区占用 512 字节。 表示将0这个字节重复510-($-$$)遍,也就是在剩下的空间中不停地填充0,直到程序有510字节为止。 这样,加上结束标志 0xaa55 占用的 2 字节,恰好是512字节。

dw 0xaa55 是引导扇区的结束标志,BIOS 通过检测这个标志来确认这是一个有效的引导扇区。

times 510 - ($-$$) db 0
dw 0xaa55

 

然后切换到nasm2目录 编译一下:将hello.asm 的 NASM 汇编源文件汇编成一个二进制文件的

nasm E:\OS\hello.asm -o E:\OS\boot.bin

下面将boot.bin 的前 512 字节复制到文件 E:\\OS\\dingst.vhd 中

dd if=boot.bin of=E:\\OS\\dingst.vhd bs=512 count=1

解释:

  • dd: 是一个常用的命令行工具,用于在 Unix/Linux 系统中进行数据转换和复制操作。
  • if=boot.bin: 指定输入文件为 boot.bin,if 是 input file 的缩写。
  • of=E:\\OS\\dingst.vhd: 指定输出文件为 E:\\OS\\dingst.vhd,of 是 output file 的缩写。
  • bs=512: 指定每次读取和写入的块大小为 512 字节,bs 是 block size 的缩写。
  • count=1: 指定复制的块数为 1,因此 dd 命令只会复制输入文件的前 512 字节。

 

3.VirtualBox打开

现在,打开Oracle VM VirtualBox,点击新建

 

起个名字,选定文件夹,类型选择其他,然后点击下一步。

 

点击下一步。

 

这里选择使用已有的虚拟硬盘文件,然后点击选择盘片

 

点击注册

 

选择上面生成的dingst.vhd

 

点击完成即可

 

完成如下:

 

启动后可以看到了输出了

 

参考

郑钢著操作系统真象还原

田宇著一个64位操作系统的设计与实现

丁渊著ORANGE’S:一个操作系统的实现

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇