- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
诊断 QEMU 中的引导加载程序代码?
我正在尝试创建一个最小的“引导加载程序代码”,打印字符“A”然后停止。
我为此目的编写了以下 C++ 程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
/*
* If I run these code directly in Windows, it crashes, for I believe Windows
* do not allow accessing the BIOS directly, that make sense
*
* But I can compile a binary, then I can use the debugger to view what machine code
* does these correspond to, and build to boot program!
*/
/*
__asm
{
mov ah, 0x0e
mov al, 0x41
mov bx, 15
int 0x10
hlt
lp: jmp lp
}
*/
int disk_length = 80 * 18 * 512 * 2;
char* disk = (char*)calloc(disk_length, sizeof(char));
const char program[] =
{
0xb4, 0x0e, // mov ah, 0EH
0xb0, 0x41, // mov al, 41H
0x66, 0xbb, 0x0f, 0x00, // mov bx, 0FH
0xcd, 0x10, // int 10H
0xf4, // hlt
0xeb, 0xfe // lp: jmp lp
};
const char boot_signature[] = {0x55, 0xAA};
const int program_length = _countof(program);
const int boot_signature_length = _countof(boot_signature);
// Be careful with file mode
FILE* imgFile = fopen("disk.img", "wb");
memcpy(disk, program, program_length);
memcpy(disk + 510, boot_signature, boot_signature_length);
int written = 0;
while (written < disk_length)
{
written += fwrite(disk + written, sizeof(char), disk_length - written, imgFile);
}
fclose(imgFile);
return 0;
}
首先,我运行了未注释内联程序集的代码。在调试器中,我导出了操作码,并确定操作码与源代码中的操作码相匹配。接下来,我运行带有注释的内联程序集的代码,然后生成一个 img 文件。我使用二进制编辑器来查看内容并确保它看起来像我想要的那样。最后,我运行了 qemu-system-i386.exe -fda disk.img,我期望引导加载程序显示大写的“A”,但什么也没有显示。
现在我有两个问题:
1.) 我的代码有什么问题?2.) 如何诊断?
最佳答案
问题似乎出在这个指令序列上:
0x66, 0xbb, 0x0f, 0x00, // mov bx, 0FH
0xcd, 0x10, // int 10H
安operand prefix 0x66在实模式下,将指令解码为 32 位寄存器(在本例中),然后使用 4 个字节对立即值进行编码。这当然会使用 int 10h
作为 mov
数据的一部分。所以你的指令真正做的是:
0x66, 0xbb, 0x0f, 0x00, 0xcd, 0x10, // mov ebx,0x10cd000f
之后是通常出现的 hlt
和 jmp
指令。在针对 16 位实模式(并预计在 8086/8088 上运行)的代码中,您根本不想使用此类前缀。您的代码应该简单地排除前缀,如下所示:
0xbb, 0x0f, 0x00, // mov bx, 0FH
0xcd, 0x10, // int 10H
您可以使用理解 16 位指令的反汇编程序来反汇编 disk.img
文件。 NDISASM 是一种可以处理 16 位代码的优秀反汇编程序,它是 NASM 程序 (Netwide Assembler) 的一部分。 NASM 适用于 Windows 。 NDISASM 将按以下方式安装并运行:
ndisasm -b16 disk.img
这将尝试将 disk.img
解码为 16 位 (-b16
) 二进制文件。您可能会发现字节中翻译后的指令是什么以及出了什么问题。
您还可以尝试使用QEMU中的远程调试功能并使用GDB调试器来单步调试您的代码。我不在 Windows 上运行 QEMU,所以我不知道它是否是使用远程调试支持构建的。
您可以考虑使用可用于生成适合在引导加载程序中使用的 16 位 8086/8088 代码的汇编器(如 NASM),而不是按您现在的方式编写引导加载程序。 Stackoverflow 上有许多问题和解答,展示了如何使用 NASM 来创建引导加载程序。
关于assembly - 诊断 QEMU 中的引导加载程序代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388084/
我正在为 aarch64 使用 qemu 模拟器,并且想要创建一个外部检查点(或快速转发)以保存我需要从创建检查点时重新启动系统的所有内容。 (其实我是想跳过开机这一步)我只在qemu VM快照和快进
我想了解这两个包之间的关系,因为更改“qemu”的源 uri 似乎会导致 qemu-native 的构建损坏。 我不是 Yocot/Bitbake 专家,所以稍微澄清一下会大有帮助。 谢谢。 最佳答案
如何写入在 QEMU 中运行的虚拟系统的处理器寄存器和特定内存地址? 我的愿望是通过在 QEMU 之外运行的用户空间程序来完成此操作。这将引起中断并精细地控制处理器和虚拟硬件的执行。 QEMU Mon
我有一个表单,用户可以在其中上传图像(不同操作系统的图像)。 如何检测图像是否为“qcow2”类型的 QEMU 图像? 最佳答案 您可以使用 qemu-img info检查图像格式。 qemu-img
我想知道是否可以编写 qemu 脚本,以便您可以启动它并自动让它在 guest 操作系统中运行程序?就我而言,那就是 Linux。基本上,我想避免与客人互动,以便我可以用秃鹰或类似的东西进行一批实验。
我想到了两种可能的机制: IPC 类似于现有的 QMP 和 QAPI QEMU 加载一个包含模型 的共享库插件 所需的能力(当然所有可能通过 C API,但不一定是 IPC API): 注入(inje
是否有选项? qemu-nbd 命令获得下一个空闲,即未使用的 NBD,如 lossup -f 做? 0.0.1 的联机帮助页(这是 qemu 当前稳定版 1.7.0 的版本)没有提及任何内容。 最佳
qemu-system-armw.exe 和 qemu-system-arm.exe 有什么区别?我在任何地方都找不到它。 最佳答案 带有 w 的可执行文件不会打开控制台窗口,而没有 w 的可执行文件
我正在尝试了解 QEMU 的区 block 链。我对每个执行的 TB 的分支方向有疑问。假设 TB#1 现在已经执行,并找到 next_tb (TB#2)。然后我们知道方向是 TB#1--->TB#2
我有一个使用 KVM 的 Windows 10 专业版虚拟机。它是通过 virt-manager 使用最新版本的 libvirt 和 QEMU 设置的。所有这些都在 Manjaro Linux 20
我开始学习 riscv。我得到了 qemu-riscv、riscv-gcc 并编译了下一个 hello world asm 程序: .section .text .globl _start _star
我有一个运行 kvm/qemu 的 Windows VM,它正在经历时间漂移。Windows 客户机的最佳 libvirt 设置是什么? 目前我正在使用这个,但它没有帮助:
我有一个运行 kvm/qemu 的 Windows VM,它正在经历时间漂移。Windows 客户机的最佳 libvirt 设置是什么? 目前我正在使用这个,但它没有帮助:
我是 qemu 开发新手。我正在尝试修改 qemu 以使用 QEMU 模拟器在 x86 机器上模拟 SGX 处理器的某些功能。这是我想要做的。 我想将以下内容添加到 qemu。我想用一个新参数 EEC
我目前正在尝试构建一个配置来测试 Big-Endian 系统上的一些代码。 通过聊天和研究,我确信这些测试的一个很好的目标是 PowerPC 架构。由于我没有一个,并且不希望在短期内直接访问一个,我正
我正在制作一个操作系统,我正在使用 Qemu 调试它。我想要一种方法来在一些指令的末尾读取一些大块的 ram。怎么做?可以对 Qemu 说将 ram 复制到文件中吗?如果不是我能做什么? 最佳答案 q
qemu/kvm 支持 ovf 吗?它能够启动现有的 ovf 软件包吗?我在 ovf 标准和 qemu/kvm 网站上找不到任何相关信息。对此有任何有用的链接吗?谢谢。 最佳答案 您正在寻找virt-
我想知道如何从 ubuntu 中的源代码构建 grub 2 引导加载程序并使用 qemu 模拟器对其进行测试。 我还想在新版本中更改 grub2 引导加载程序的默认背景图像吗? 这可能吗?如果是,怎么
我的环境是Ubuntu15.10。我写了下面的源代码。 #include "efi.h" #include "efilib.h" EFI_STATUS EFIAPI efi_main(EFI_HAND
我正在尝试使用 qemu 调试 linux 内核的启动顺序,我正在运行的命令是: qemu -serial stdio -kernel -hda -append "root=/dev/sda
我是一名优秀的程序员,十分优秀!