- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了从闪存驱动器启动,我们在实模式下使用 BIOS 中断 13h 加载磁盘并指定磁盘 0x80。另一个磁盘应该由 0x81、0x82... 访问,如 this link 中所述
我正在尝试制作我的简单 GRUB。
我的第一步是从闪存驱动器启动(将 MBR 加载到 0x7C00 并打印一条消息作为正确启动的证明)并读取我的主硬盘(我假设它的编号为 0x81 并且前 15 个扇区需要引导)再次进入 0x7C00。
我想这个天真的想法应该让我进入我的主硬盘的引导加载程序,但它并不像预期的那样。你能告诉我哪里出了问题吗?
顺便问一下,我应该如何获取硬盘的数量?
请注意,我的主硬盘包含带有多个操作系统的 grub2。
编辑:对我来说这是一个理论问题,但由于评论中的要求,我添加了代码。
bootloader.asm:
[bits 16]
[org 0x7C00]
; The bootloader is in charge of writing BPB into MBR in addition to installing this code.
; Then a second sector is written to the drive, this is where the FAT is allocated.
LOADER_OFFSET equ 0x1000
jmp short main
nop
%include "ASM/BPB.asm"
main:
xor ax, ax
mov ds, ax
mov es, ax
; Save the boot drive. Basically it should be 0x80
mov [BOOT_DRIVE], dl
mov ax, 0x0000 ; End of stack
; Lock and create stack
cli
mov ss, ax
mov sp, 0x0000
sti
mov ah, 0x0e
mov al, 'X'
int 0x10
; Load the second sector into memory at LOADER_OFFSET
mov bx, LOADER_OFFSET
mov al, 1
mov cl , 0x02
mov dl, [BOOT_DRIVE]
call disk_load
; Call the loader using segmentation
jmp 0x0000:LOADER_OFFSET
; Global variables
BOOT_DRIVE db 0
%include "ASM/disk_load.asm"
; Bootsector padding
times 510-($-$$) db 0
dw 0xAA55
第二阶段引导加载程序-loader.asm:
[bits 16]
[org 0x1000]
KERNEL_OFFSET equ 0x7C00
_start:
xor ax, ax
xor bx, bx
mov ah, 0x0e
mov al, 'Y'
int 0x10
mov bx, KERNEL_OFFSET
mov al, 15
mov dl , 0x81
mov cl , 0x01
call disk_load
jmp 0x7C0:0000
%include "ASM/disk_load.asm"
times 512-($-$$) db 0
BPB.asm:
BPB:
iOEM db "mkfs.fat" ; 0x03 ; OEM String
iSectSize dw 512 ; 0x0B ; Bytes per sector
iClustSize db 0x40 ; 0x0D ; Sectors per cluster
iResSect dw 0x1 ; 0x0E ; # of reserved sectors. For now, it should be 1
; 0x0E ; unless we need more space to write the bootstrap
; 0x0E ; sector
iFatCnt db 2 ; 0x10 ; # of fat copies
iRootSize dw 1024 ; 0x11 ; size of root directory
iTotalSect dw 0 ; 0x13 ; total #of sectors if below 32 MB
iMedia db 0xF8 ; 0x15 ; Media Descriptor
iFatSize dw 256 ; 0x16 ; Size of each FAT
iTrackSect dw 62 ; 0x18 ; Sectors per track
iHeadCnt dw 63 ; 0x1A ; number of read-write heads
iHiddenSect dd 0 ; 0x1C ; number of hidden sectors
iSect32 dd 0x003c3000 ; 0x20 ; # of sectors if over 32 MB
EBPB:
iBootDrive db 80 ; 0x24 ; holds drive that the boot sector came from
iReserved db 0 ; 0x25 ; reserved, empty
iBootSign db 0x29 ; 0x26 ; extended boot sector signature
iVolID dd 0xA8B531B1 ; 0x27 ; disk serial
acVolLabel db "BIOSver", 0x20, 0x20, 0x20, 0x20 ; 0x2B ; just placeholder. We don't yet use volume labels.
acFSType db "FAT16", 0x20, 0x20, 0x20 ; 0x36 ; file system type
磁盘加载.asm:
disk_load:
push dx
mov ah , 0x02
mov ch , 0x00
mov dh , 0x00
int 0x13
jc disk_error
pop dx
ret
disk_error:
pop si
pop ax
pop cx
pop dx
jmp $
; Variables
SECTORS db 0
生成文件:
ASFLAGS=-g3
all: os.img
os.img: bootloader.bin loader.bin
cat bin/bootloader.bin bin/loader.bin > bin/os.img
bootloader.bin: ASM/bootloader.asm
nasm $(ASFLAGS) $^ -f bin -o bin/$@
loader.bin: ASM/loader.asm
nasm $(ASFLAGS) $^ -f bin -o bin/$@
clean:
rm -f bin/*.* bin/* os.img
此代码应将 XY
打印到屏幕,然后将控制权传递给 HDD 的引导扇区。但我得到的只是 XY
打印到屏幕上。
最佳答案
根据 Micheal Petch 的上述评论回答我自己的问题:主要有两个问题:1. 使用模拟器并不一定意味着所有驱动器都已加载,这是我的情况2. 用jmp 0x100:0000加载磁盘扇区到0x0000:0x1000。
此外,链式加载需要覆盖中断 13 以重新安排启动设备的数量,如 rufus 中所述。代码(即闪存到 0x81,主硬盘到 0x80)。
关于assembly - 最简单的链式加载引导管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42790410/
我想要显示正在加载的 .gif,直到所有内容都已加载,包括嵌入的 iframe。但是,目前加载 gif 会在除 iframe 之外的所有内容都已加载后消失。我怎样才能让它等到 iframe 也加载完毕
首先,这是我第一次接触 Angular。 我想要实现的是,我有一个通知列表,我必须以某种方式限制 limitTo,因此元素被限制为三个,在我单击按钮后,其余的应该加载。 我不明白该怎么做: 设置“ V
我正在尝试在我的设备上运行这个非常简单的应用程序(使用 map API V2),并且出于某种原因尝试使用 MapView 时: 使用 java 文件: public class MainMap e
我正在使用 Python 2.6、Excel 2007 Professional 和最新版本的 PyXLL。在 PyXLL 中加载具有 import scipy 抛出异常,模块未加载。有没有人能够在
我想做这个: 创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 A
**摘要:**在java项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。 本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy工程师。
在 Groovy 脚本中是否可以执行条件导入语句? if (test){ import this.package.class } else { import that.package.
我正在使用 NVidia 视觉分析器(来自 CUDA 5.0 beta 版本的基于 eclipse 的版本)和 Fermi 板,我不了解其中两个性能指标: 全局加载/存储效率表示实际内存事务数与请求事
有没有办法在通过 routeProvider 加载特定 View 时清除 Angular JS 存储的历史记录? ? 我正在使用 Angular 创建一个公共(public)安装,并且历史会积累很多,
使用 Xcode 4.2,在我的应用程序中, View 加载由 segue 事件触发。 在 View Controller 中首先调用什么方法? -(void) viewWillAppear:(BOO
我在某些Django模型中使用JSONField,并希望将此数据从Oracle迁移到Postgres。 到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持J
创建 Nib 时,我需要创建两种类型:WindowNib 或 ViewNib。我看到的区别是,窗口 Nib 有一个窗口和一个 View 。 如何将 View Nib 加载到另一个窗口中?我是否必须创建
我想将多个env.variables转换为静态结构。 我可以手动进行: Env { is_development: env::var("IS_DEVELOPMENT")
正如我从一个测试用例中看到的:https://godbolt.org/z/K477q1 生成的程序集加载/存储原子松弛与普通变量相同:ldr 和 str 那么,宽松的原子变量和普通变量之间有什么区别吗
我有一个重定向到外部网站的按钮/链接,但是外部网站需要一些时间来加载。所以我想添加一个加载屏幕,以便外部页面在显示之前完全加载。我无法控制外部网站,并且外部网站具有同源策略,因此我无法在 iFrame
我正在尝试为我的应用程序开发一个Dockerfile,该文件在初始化后加载大量环境变量。不知何故,当我稍后执行以下命令时,这些变量是不可用的: docker exec -it container_na
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚遇到一个问题,我有一个带有一些不同选项的选择标签。 现在我想检查用户选择了哪些选项。 然后我想将一个新的 html 文件加载到该网站(取决于用户选中的选项)宽度 javascript,我该怎么做
我知道两种保存/加载应用程序设置的方法: 使用PersistentStore 使用文件系统(存储,因为 SDCard 是可选的) 我想知道您使用应用程序设置的做法是什么? 使用 PersistentS
我开始使用 Vulkan 时偶然发现了我的第一个问题。尝试创建调试报告回调时(验证层和调试扩展在我的英特尔 hd vulkan 驱动程序上可用,至少它是这么说的),它没有告诉我 vkCreateDeb
我是一名优秀的程序员,十分优秀!