Assembly:引导签名后不执行命令

问题描述 投票:1回答:1

我的操作系统的引导扇区实际上达到了512个字节,并且我的代码没有足够的空间。我在引导签名后写了一些代码,但是它们不起作用。我将代码关闭,但没有用。为什么启动签名后的代码不起作用?

代码:

BITS 16

disk_buffer equ 24576

mov sp, 4096d
mov ax, 7c0h
mov ds, ax

mov ah, 09h
mov cx, 1000h
mov al, 20h
mov bl, 17h
int 10h

jmp shutdown

;codes that off the point

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

shutdown:
mov ax, 5307h
mov cx, 3
mov bx, 1
int 15h

times 1474560 - ($ - $$) db 0
assembly x86-16 bootloader
1个回答
0
投票

您必须使用该512字节来加载其余代码。这就是它的用途,因此名称为“引导记录”。

如果您在MBR中编写操作系统代码,那么您将在错误的位置进行操作。大多数操作系统通过这种方式分三个(或更多)阶段。首先,您的MBR代码将一个简单的引导加载程序从磁盘加载到ram中。然后,MBR代码跳转到将引导加载程序加载到的位置,并开始执行引导加载程序。引导加载程序会进行一些系统初始化,然后将第二阶段的引导加载程序或操作系统加载到内存中,然后跳转到该内存以开始引导操作系统。

来自osdev Wiki

MBR由BIOS加载到物理地址0x7c00,并且设置了DL到加载MBR的“驱动器号”。 BIOS然后跳转到已加载MBR(0x7c00)的开头,因为MBR的一部分包含“ bootstrap”可执行代码。

典型的MBR引导程序代码将执行以下操作:

-将自身远离0x7c00物理地址(使用内存副本,通常是远距离跳转)

-确定要从哪个分区(或硬盘)引导(通过查找活动分区,或向用户显示一个选择已安装的操作系统以供选择)

-如果用户选择了一个“非活动”分区,然后将所选分区条目设置为“活动”,并清除其他分区条目的“活动”位

如果修改了分区表条目,请使用BIOS INT 13h命令重写MBR

-使用BIOS INT 13h命令从所选的开头开始加载卷引导记录(VBR,引导加载程序的“引导扇区”)

对物理地址0x7c00的分区

-设置DS:SI指向所选分区表条目

-跳转到0x7c00(CS设置为0,DL设置为“驱动器号”)

注意:它用于DL的值,而DS:SI指针是一路传递到内核,供内核使用。这也是表示在引导过程中不应覆盖已重定位的MBR流程-因为DS:SI指针针对分区表该MBR内的条目,并且需要保持有效。

© www.soinside.com 2019 - 2024. All rights reserved.