当前位置:  开发笔记 > 运维 > 正文

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

如何解决《使用自定义引导加载程序创建可引导的ISO映像》经验,为你挑选了2个好方法。

我试图将我用汇编语言编写的引导加载程序转换为ISO映像文件.以下是MikeOS bootloader 的代码.这是我的引导程序代码:

   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.我如何解决我遇到的问题?还有另一种更简单的方法可以将我的bootloader .bin文件转换为ISO映像吗?



1> Michael Petc..:

您似乎找到了从此StackOverflow应答程序创建可引导ISO映像的示例.不幸的是,您在许多方面选择了一个不正确的答案.假装你从未见过那个答案.

在大多数Linux发行版上都有一个叫做genisoimagemkisofs存在的程序.这些天他们实际上是同一个程序.您可以在下面的示例中替换您的任何一个.我的示例将假设调用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.imgiso目录中,因为我们需要来启动系统.第三个命令执行繁重的工作并构建ISO映像.

-V 'MYOS' 设置卷标(它可以是你想要的任何东西)

-input-charset iso8859-1设置正在使用的字符集.不要改变它

-o myos.iso表示ISO图像将输出到文件myos.iso

-b floppy.img说我们的ISO可以启动,而使用的启动映像就是文件floppy.img

-hide floppy.img不需要,但它隐藏了最终ISO目录列表中的启动映像.如果您要安装此ISOls在其上执行以列出文件,则floppy.img不会出现.

iso/在命令的末尾是将用于构建ISO映像的目录.它至少需要包含我们的可启动软盘映像,但您可以将所需的任何其他文件放入iso/目录中.


可以引导生成的ISO映像myos.iso.使用QEMU启动此类图像的示例:

qemu-system-i386 -cdrom ./myos.iso



2> Brendan..:

对于CD; 有一个规范(“ El Torito”)描述了可启动CD的工作方式;在前16个(2048字节)扇区未使用的情况下,固件会使用“引导目录”来决定应使用的引导加载程序(因此,您可以使用一张CD来引导非常不同的系统,例如PC BIOS,UEFI ,PowerPC等),然后引导加载程序本身。

仅对于“ PC BIOS”,就有3种可能性:

模拟软盘(使用CD中存储的“软盘映像”)

模拟硬盘(使用CD上存储的“硬盘映像”)

没有模拟

前两个选项主要用于兼容目的(旧的不支持从CD引导的旧OS,例如MS-DOS);并且具有性能影响(例如,为了模拟加载一个512字节的虚拟扇区,固件必须加载一个实际的2048字节的扇区,并丢弃多余的1536字节)。在过去15年以上设计/编写的任何操作系统都应使用“无仿真”。

对于“无仿真”:

固件会加载整个引导加载程序(最高可达512 KiB),而不仅仅是一个扇区

CD上的扇区为2048字节(而不是512字节)。并应通过加载。“ int 0x13扩展名”(而不是用于软盘的旧的/有限的“ CHS磁盘功能”)

There is no need for a BIOS Parameter Block (which should be considered mandatory for floppy disks)

There is no need for a partition table (which should be considered mandatory for hard disks, including GPT)

You'll probably want to support ISO9660 as the file system (to find the kernel and/or other files that the boot loader needs to load) and not FAT.

Also note that (in general) for "PC BIOS" you're probably going to want 5 different boot loaders (one for floppy, one for "MBR partitioned" hard disk, one for "GPT partitioned" hard disk, one for CD, and one for network boot). These cases are all different enough (and the "one 512-byte initial sector only" limitation for 3 of these cases is restrictive enough) to make the "all devices supported by one boot loader" idea a disaster.

To actually generate the ISO; you can use an existing tool (e.g. mkisofs), or you can write your own tool (ISO9660 and "El Torito" are both relatively easy to understand, and writing your own tool to generate an ISO can be done in less than 2 days, which is like a drop in the ocean for OS development projects).

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有