使用自定义引导加载程序创建可引导 ISO 映像

2024-01-05

我正在尝试将我用汇编语言编写的引导加载程序转换为ISO图像文件。以下是代码来自MikeOS http://mikeos.sourceforge.net/write-your-own-os.html引导加载程序。这是我的引导加载程序代码:

   BITS 16
start:
    mov ax, 07C0h     ; Set up 4K stack space after this bootloader
    add ax, 288       ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h     ; Set data segment to where we're loaded
    mov ds, ax

    mov si, text_string   ; Put string position into SI
    call print_string ; Call our string-printing routine

    jmp $         ; Jump here - infinite loop!
    text_string db 'This is my cool new OS!', 0

    print_string:         ; Routine: output string in SI to screen
    mov ah, 0Eh       ; int 10h 'print char' function

.repeat:
    lodsb         ; Get character from string
    cmp al, 0
    je .done      ; If char is zero, end of string
    int 10h           ; Otherwise, print it
    jmp .repeat
.done:
    ret

    times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
    dw 0xAA55     ; The standard PC boot signature

我输入了以下命令:

nasm -f bin -o boot.bin boot.asm 

该命令运行良好,并给出 .bin 输出。接下来我输入以下命令:

dd if=boot.bin of=floppy.img count=1 bs=512 

这也工作得很好,并给了我 .img 输出文件。当我输入这个命令时:

dd if=boot.bin of=floppy.img skip seek=1 count=1339

我收到以下错误:dd: unrecognized operand ‘skip’。我读到DD文档表明,skip 属性必须分配有一个编号。任何想法我应该使用skip属性输入什么数字(例如skip = 1)。

接下来我输入以下命令:

mkdosfs -C floppy.img 1440 

我收到以下错误:mkdosfs: unable to create floppy.img。如何解决我遇到的问题?有没有另一种更简单的方法可以将我的引导加载程序 .bin 文件转换为ISO image?


看来您找到了创建可启动的示例ISO图像来自这个堆栈溢出答案 https://stackoverflow.com/a/5462351/3857942。不幸的是,您选择的已接受答案在很多方面都是不正确的。假装你从未见过这个答案。

在大多数 Linux 发行版上,有一个名为genisoimage or mkisofs存在。如今它们实际上是同一个程序。无论您有什么,都可以在下面的示例中进行替换。我的例子将假设ISO创建实用程序称为genisoimage.


在您的问题中,您在名为的文件中有一些引导加载程序代码boot.asm。您可以使用以下命令正确地将其组装为引导扇区二进制映像:

nasm -f bin -o boot.bin boot.asm

这创造了boot.bin这是你的引导扇区。下一步是创建软盘映像并放置boot.bin在第一部门。你可以这样做:

dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc

第一个命令只是使零填充的磁盘映像等于 1.44MB 软盘的大小(1024*1440 字节)。第二个命令放置boot.bin进入第一部门floppy.img而不截断文件的其余部分。seek=0表示寻找第一个扇区(512 字节是块的默认大小DD). count=1指定我们只想复制 1 个扇区(512 字节)boot.bin. conv=notrunc表示写入输出文件后,剩余的磁盘映像将保持完整(不被截断)。


如上所示构建磁盘映像后,您可以创建一个ISO使用这些命令的图像:

mkdir iso
cp floppy.img iso/
genisoimage -quiet -V 'MYOS' -input-charset iso8859-1 -o myos.iso -b floppy.img \
    -hide floppy.img iso/

上面的命令首先创建一个名为的子目录iso它将包含要放置到最终 CD-ROM 映像上的文件。第二个命令除了复制我们的内容之外什么也不做floppy.img into iso目录,因为我们需要它来启动。第三个命令完成繁重的工作并构建ISO image.

  • -V 'MYOS'设置卷标(可以是任何你想要的)
  • -input-charset iso8859-1设置正在使用的字符集。不要改变它
  • -o myos.isoISO图像将输出到文件中myos.iso
  • -b floppy.img说我们的ISO将是可启动的,并且正在使用的启动映像是该文件floppy.img
  • -hide floppy.img不需要,但它会隐藏最终 ISO 目录列表中的启动映像。如果你要安装这个ISO并做一个ls在其上列出文件,floppy.img不会出现。
  • iso/命令末尾是将用于构建的目录ISO图像来自.它至少需要包含我们的可启动软盘映像,但您可以将任何其他文件放入iso/目录。

The ISO image myos.iso生成的文件可以启动。使用示例QEMU启动这样的图像:

qemu-system-i386 -cdrom ./myos.iso
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义引导加载程序创建可引导 ISO 映像 的相关文章

  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • 在单个命令中使用前缀重命名文件夹中的所有文件

    重命名带有前缀的文件夹中的所有文件 Unix 假设一个文件夹有两个文件 a txt b pdf 那么它们都应该从一个命令重命名为 Unix a txt Unix b pdf 如果您的文件名包含没有空格并且你没有任何子目录 你可以使用一个简单
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并

随机推荐