c - VirtualBox 无法加载 .img 或 .flp 文件

标签 c assembly virtualbox osdev

我尝试用 C 语言编写一个简单的内核。我找到了这个教程:Bare Bones 。我已经按照步骤操作了。当我将“o”文件编译为一个“bin”文件时,我尝试在VirtualBox中运行它。我已将“bin”扩展名更改为“img”。我创建了一个新的虚拟机,当我尝试将“img”文件设置为软盘镜像时,出现错误:

A floppy fájl megnyitása sikertelen: path_of_file. (Eng.: failed to load floppy image.)

Could not get the storage format of the medium 'path_of_file' (VERR_NOT_SUPPORTED).

Eredmény kód: VBOX_E_IPRT_ERROR (0x80BB0005) (Eng.: Result code.)

Komponens: Medium (Eng.: Component.)

Interfész: IMedium {05f2bbb6-a3a6-4fb9-9b49-6d0dda7142ac} (Eng.: Interface.)

Callee: IVirtualBox {fafa4e17-1ee2-4905-a10e-fe7c18bf5554}

Callee RC: VBOX_E_OBJECT_NOT_FOUND (0x80BB0001)

如果有人能告诉我问题是什么以及如何解决它,我会非常高兴。我已经在互联网上寻找解决方案,但我还没有找到。 我使用的软件:

  • NASM 2.11.06
  • i686-elf-gcc 4.8.2(来自 OSDev forum)
  • VirtualBox 4.3.20

我的操作系统是 Windows 7 Professional 64 位。

(抱歉我的英语不好,但我一直在学习这门语言。)

谢谢。

最佳答案

一种选择是使用 http://qemu.weilnetz.de/ 中的 QEMU 。将 PATH 变量设置为 QEMU 二进制目录(在 QEMU 安装目录中)。打开保存 kernel.bin 的命令提示符,然后输入:

qemu-system-i386 -kernel kernel.bin

否则,您需要使用现有的引导加载程序(最好是 GRUB2)来创建可引导 ISO 磁盘。现在,您拥有的只是一个二进制文件,其中包含您的内核代码。

1) 创建一个名为 grub.cfg 的文件,其中包含以下内容:

menuentry "my os" {
    multiboot /boot/kernel.bin
    boot
}

2) 在终端中运行以下命令:

mkdir isodir
mkdir isodir/boot
mkdir isodir/boot/grub

3)将grub.cfg文件保存在isodir/boot/grub目录下。

4) 将 kernel.bin 文件复制到 isodir/boot

5) 从此处下载 setup-x86.exe 获取 32 位 Cygwin: https://cygwin.com/install.html (如果您已经安装了它,请运行您的安装文件并跳到步骤 7)

6) 运行文件,选择安装目录、软件包目录和GNU镜像。

7) 软件包列表出现后,取消选中“隐藏过时的软件包”复选框。

8) 在搜索栏中搜索 grub,它应该在过时类别中显示为“grub2”。选择它进行安装并继续。

9) 安装后(记住将 Cygwin 二进制目录添加到您的路径中),只需运行:

sh grub-mkrescue --output=myos.iso isodir

然后您可以在 VirtualBox 中运行“myos.iso”文件。

如果您有任何疑问,请发表评论。希望这有帮助!

关于c - VirtualBox 无法加载 .img 或 .flp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27781614/

相关文章:

c++ - GCC 的 __builtin_expect 程序集转储似乎总是下降分支

汇编编号转为 ascii

ssh - 打包程序等待 SSH

virtualbox - Virtualbox 是否支持 Intel 快速同步视频?

Windows guest 虚拟机中的 Docker

iphone - 从另一个线程C/C++在主线程上执行类方法或函数(静态方法)

c - 这c组 Actor 是什么疯子

c - 交换两个文件的内容

gcc - 为什么使用 arm-linux-gnueabi-gcc 编译时堆栈指针比堆栈帧大小向下移动 4 个字节?

c - GCC优化对位操作的有效性