C 链接器(ld)输出.img

C 链接器(ld)输出.img,c,gcc,assembly,linker,ld,C,Gcc,Assembly,Linker,Ld,我正在用C和汇编语言开发一个微型内核。 这是我的程序集文件: global loader extern main MODULEALIGN equ 1<<0 MEMINFO equ 1<<1 FLAGS equ MODULEALIGN | MEMINFO MAGIC equ 0x1BADB002 CHECKSUM equ -(MAGIC + FLAGS) section .text align 4 MultiBootHeader: dd MAGIC

我正在用C和汇编语言开发一个微型内核。 这是我的程序集文件:

global loader
extern main

MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
FLAGS equ MODULEALIGN | MEMINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
    align 4

MultiBootHeader:
    dd MAGIC
    dd FLAGS
    dd CHECKSUM

STACKSIZE equ 0x4000
loader:
    mov esp, stack+STACKSIZE
    push eax
    push ebx

call main

cli

hang:
   hlt
   jmp hang

section .bss
    align 4
stack:
    resb STACKSIZE
我的链接器(.ld)文件是:

用于编译我使用的汇编程序文件

nasm -f elf bootloader.asm
gcc -m32 -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
ld -m elf_i386 bootloader.o kernel.o -o os.img 
当我编译C文件时,我使用

nasm -f elf bootloader.asm
gcc -m32 -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
ld -m elf_i386 bootloader.o kernel.o -o os.img 
对于compile
.ld
文件,我使用

nasm -f elf bootloader.asm
gcc -m32 -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
ld -m elf_i386 bootloader.o kernel.o -o os.img 
但是输出(
os.img
)与VirtualBox和QEMU不兼容。所以我的问题是:

如何在软盘映像(.img)或ISO文件中编译这些文件

要从任何设备启动操作系统,还需要它的神奇数字,即0xaa55
您也应该在链接器文件中使用它作为签名。 请参阅Linux setup.ld文件(您可以查看签名部分。Linux使用0x5a5aaa55):

要编译asm文件,请执行以下操作:

%.bin: %.asm
      nasm $< -f bin -o $@
最后,要创建操作系统二进制映像,您可以执行以下操作:

os-image.bin: bootsect.bin kernel.bin
          cat $^ > os-image.bin
qemu-system-i386 -fda os-image.bin
bootssect.bin
是程序集文件(程序集条目)的编译文件。我们先编译了它。
要在qemu中运行,您可以执行以下操作:

os-image.bin: bootsect.bin kernel.bin
          cat $^ > os-image.bin
qemu-system-i386 -fda os-image.bin

选项-fda将以软盘映像的形式运行您的映像。

谷歌“loopfs”关于:
*mem=*消息这不会复制消息。建议:
strcpy(mem,message)(假设*message的内容是以NUL结尾的字符串。如果不是,则需要知道*message的实际长度,并使用类似于:`memcpy(mem,message,messageLength);您的进程不会创建磁盘映像。它会创建一个与多引导兼容的elf可执行文件。如果要使用GRUB创建ISO(multboot引导加载程序)您可以使用grub mkrescue。在QEMU中,您应该能够通过
QEMU-system-i386-kernel os.img
使用链接器脚本来启动内核,您可以执行
ld-T link.ld-m elf\u i386 bootloader.o kernel.o-o os.img
(其中
link.ld
是您所称的链接器脚本),因为正如我所说的os.img不是磁盘映像(您的文件名非常容易误导,因此对您没有帮助).
os.elf
可能是一个更好的名称,它是一个elf可执行文件。VirtualBox没有内置的grub支持。正如我在前面的评论中提到的,您可以创建一个包含grub的ISO映像,并让它运行内核。这可以通过使用
grub mkrescue
程序来完成。