assembly - 如何从第二阶段引导加载程序将更多代码加载到内存中?
问题描述
我使用该代码加载我的第二个扇区(引导加载程序扩展):
mov ah, 00; // reset disk
int 13h; // disk interrupt
mov ax, 0x0000; // register ax [0000]:1000
mov bx, 0x1000; // register bx 0000:[1000]
mov ah, 0x2; // read sector instruction
mov al, 0x2; // sectors to read
mov ch, 0x0; // cylinder
mov cl, 0x6; // local to write
mov dh, 0x0; // head
int 0x13; // call the disk interupter
jmp 0x0000:0x1000; // Jump to kernel
但我想在内存中加载另一个内核(保护模式内核),我如何使用这段代码来加载它或者我必须使用其他方式?
引导加载程序 = 1 扇区 512 字节
内核 x16 = 2 扇区 1024 字节
内核 x32 = 2 扇区 1024 字节(我知道我可以加载更多,更改 AL)
解决方案
您不想在 16 位内核运行时加载 32 位内核,因此您需要使用不同的内存地址来加载数据。(在磁盘读取调用和远 jmp 中)。
但是,是的,当您仍处于 16 位实模式时,显然相同的 BIOS 调用以相同的方式工作。@MichaelPetch 评论了我是否必须不断更改扇区,或者我可以加载多个,您可以安全地加载多个扇区,但是为了便于移植到有问题的 BIOS,您应该避免加载太多以至于您越过柱面边界。如果是这种情况,请使用多个调用。
只需制作一个具有 16 位入口点的组合内核并使用一个 4 扇区加载从引导加载程序加载整个内容会更简单。
您可以在一个 NASM 源文件中使用BITS 16
和BITS 32
来组装 16 位和 32 位模式。您甚至可以将标签用于 far-jmp 到 32 位代码,而不是加载代码的硬编码地址。
也可以看看:
- 引导加载程序不会跳转到内核代码
- 如何为我的引导加载程序制作内核?
- 如何从第一阶段加载第二阶段引导加载程序?(两阶段引导加载程序设置类似于您要询问的内容。)
推荐阅读
- css - 搞砸了我的代码,试图实现 flexbox
- ruby-on-rails - 使用刺激 js 在 Rails 中渲染模态
- javascript - Node.JS V12 Trello API 如何检查卡片是否过期
- python - 使用 python PyPDF2 合并 PDF 文件
- c - 调试函数
- azure-devops - Azure DevOps REST API 执行 Git 合并
- python - 如何从多个模型 django 渲染数据
- c++ - 元素
具有无效值“多线程调试 (/MTd)” - arrays - 如何为我自己的 shell 的历史功能处理 100 的历史限制
- ruby-on-rails - check_authorization 导致自定义设计控制器失败?