- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 x86 实模式编程,并使用 QEMU 编写了一个小型引导加载程序来测试它。我选择了 GNU 汇编器来学习。
这是汇编代码:
#
# boot.s
#
.section .text
.globl start
start:
//setup stack
mov $0x7c0, %ax
mov %ax, %ss
mov $512, %sp
//setup video
mov $0x0, %eax
mov $0x0, %al
int $0x10
//print a character say 'm'
mov $'m', %al
mov $0x0E, %ah
int $0x10
1:
jmp 1b
QEMU 显示屏上显示以下文本:
Booting from Hard disk...
问题:上面的消息被打印出来了,但它仍然是那样,似乎什么也没做。
我用来组装的脚本,链接是:
> to assemble : gcc -c boot.s
> to link : ld -T link.ld boot.o -o b.bin
> to put on bootsector of Hard-disk image
dd if=b.bin of=HD.img conv=notrunc
> to attach boot magic
echo -ne "\x55\xaa" | dd seek=510 bs=1 of=HD.img
> to emulate: qemu-system-i386 HD.img
从我在某处看到的在线教程复制的链接器脚本,因为我自己不知道如何创建一个:
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}
我需要指定任何额外的参数还是代码中有错误?我认为这是堆栈的设置,但尝试了很多可能性,但没有奏效。
如何跳过硬盘引导消息并让引导加载程序在屏幕上显示字母 m
?
我的工作平台是 Fedora 23。
最佳答案
您的链接描述文件似乎是为保护模式内核将在 0x00100000 加载的环境编写的。这对于符合 multiboot specification 的引导加载程序很常见。 .像您这样的实模式引导加载程序将从磁盘的前 512 个字节读取并放置在内存中的 0x7c00 处。您需要一个使用 0x7c00 原点的链接器脚本。您也可以使用链接描述文件输出启动盘签名 0xAA55。
基本的引导加载程序链接器脚本可能类似于 link.ld
:
OUTPUT_FORMAT("binary");
ENTRY(start);
SECTIONS
{
. = 0x7C00;
.text : AT(0x7C00) {
*(.text);
}
.data : SUBALIGN(0) {
*(.data);
*(.rodata);
}
.bss : SUBALIGN(4) {
__bss_start = .;
*(COMMON);
*(.bss)
. = ALIGN(4);
__bss_end = .;
}
__bss_sizel = SIZEOF(.bss)>>2;
__bss_sizeb = SIZEOF(.bss);
/* Boot signature */
.sig : AT(0x7DFE) {
SHORT(0xaa55);
}
}
您的 boot.s
未被告知生成 16 位代码。您可以将指令 .code16
放在程序集文件的顶部,以强制它生成 16 位指令。您还必须修改您的 GCC 命令以编译为 16 位代码,并且链接器将需要 -melf_i386
选项。
您的引导加载程序代码应该真正设置 DS 寄存器以及堆栈。由于链接描述文件假定代码位于内存位置 0x07c00,我们需要将 DS 设置为零。在 segmented model物理地址 = (segment<<4)+offset 。 DS 设置为 0,0x7c00 的原点(基本偏移量)将映射到 (0<<4)+0x7c00 = 物理地址 0x07c00,这是 BIOS 加载我们的引导加载程序的位置。
我用一些 general bootloader tip 写了一个答案这可能有点值(value)。
清理后的 boot.s
可能如下所示:
#
# boot.s
#
.code16
.section .text
.globl start
start:
//setup stack
mov $0x7c0, %ax
mov %ax, %ss
mov $512, %sp
xor %ax, %ax # AX = 0
mov %ax, %ds # Set DS = 0 since origin point is 0x7c00
//setup video
xor %ax, %ax # Zero 16-bit AX register (includes AL and AH)
//mov $0x0, %ax # Works but is not preferred for zeroing a reg
int $0x10
//print a character say 'm'
mov $'m', %al
mov $0x0E, %ah
int $0x10
1:
jmp 1b
要组装、链接和生成您可以使用的磁盘镜像:
gcc -c boot.s -m16
ld -melf_i386 -T link.ld boot.o -o b.bin -nostdlib --nmagic
dd if=b.bin of=HD.img conv=notrunc
然后您可以将镜像用作软盘来运行它:
qemu-system-i386 -fda HD.img
或作为硬盘镜像使用:
qemu-system-i386 -hda HD.img
关于assembly - Int 10H 在 QEMU 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38041478/
我正在为 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
我是一名优秀的程序员,十分优秀!