相关疑难解决方法(0)

引导加载程序不会跳转到内核代码

我正在编写小型操作系统 - 用于练习.我从bootloader开始.
我想创建一个以16位实模式运行的小命令系统(现在).
我创建了重置驱动器的bootloader,然后在bootloader之后加载扇区.
问题是因为jmp功能后没有任何实际发生.

我不想尝试在0x7E00加载下一个扇区(我不完全确定如何使用es:bx指向地址,这可能是一个问题,我相信它的地址:偏移),就在引导加载程序之后.

这是代码:

;
; SECTOR 0x0
;

;dl is number of harddrive where is bootloader
org 0x7C00
bits 16

;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1  ;sectors to read
mov ch,0x0  ;tracks
mov cl,0x1  ;sector
mov dh,0x0  ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00 …
Run Code Online (Sandbox Code Playgroud)

assembly virtualbox nasm bootloader x86-16

15
推荐指数
1
解决办法
4475
查看次数

传统BIOS引导加载程序在第二阶段引导实模式代码

我正在编写自己的操作系统.到目前为止,我的代码超过512字节,这太大了,无法容纳在简单的引导扇区中.

据我所知,我现在必须编写一个读取任意代码的引导加载程序,这些代码可能会也可能不会超过一个512字节的扇区.

引导程序需要:

  • 用作具有磁盘签名0xaa55的引导记录.
  • 从存储器地址0x7E00开始读取从LBA 1(LBA 0是引导扇区)开始的任意长度的第二阶段(测试代码).
  • 使用FAR JMP将控制转移到0x0000:0x7E00.
  • 可用作1.44 MiB软盘映像,用于QEMU,BOCHS,VirtualBox等仿真器.
  • 可以在USB记忆棒上传输和使用,以便在BIOS设置为使用软盘驱动器(FDD)仿真启动USB的情况下在真实硬件上进行测试.注意:放置在USB驱动器上时,某些引导加载程序无法正常工作.
  • 将启动驱动器传递到DL中的第二阶段.
  • 将所有段寄存器清零并将SS:SP设置为0x0000:0x7C00(从引导加载程序下方向下增长).

这也是提出涉及操作系统开发的Stack Overflow问题的一个很好的起点.程序员经常很难创建一个Minimal,Complete和Verifiable示例.一个常见的样板/模板将允许其他Stack Overflow用户希望通过有限的大惊小怪来帮助测试代码.

我将如何构建这样一个可重用的引导程序?

usb x86 assembly osdev bootloader

14
推荐指数
1
解决办法
391
查看次数

标签 统计

assembly ×2

bootloader ×2

nasm ×1

osdev ×1

usb ×1

virtualbox ×1

x86 ×1

x86-16 ×1