Ich arbeite an einem einfachen Betriebssystem (zum Spaß), aber ich bin auf ein ziemlich eigenartiges Problem gestolpert, das ich nicht finden kann, wie zu beheben.Makefile nicht Binärcode richtig kopieren
Wenn ich versuche, kernel.bin zu boot/boot_sect.bin zu verketten und das Ergebnis in os-image zu speichern, wird anscheinend der Assemblycode kopiert, aber die Datei kernel.bin wird wie erwartet verkettet. Allerdings boot/boot_sect.bin existiert und enthält die korrekten binären Daten, wie ich unten demonstriere.
Wenn ich boot/boot_sect.bin in boot_sect_real.bin mit dem Windows 10-Dateiexplorer kopiert habe und dann den gleichen Befehl ausgeführt habe, aber stattdessen boot_sect_real.bin, funktioniert alles wie erwartet. Es scheint also etwas damit zu tun zu haben, dass sich boot_sect.bin in einem Verzeichnis befindet oder sich boot_sect.bin und boot_sect.asm im selben Verzeichnis befinden. Ich bin mit MinGW auch ein Makefile zu verwenden (mit mingw32-make)
Dies ist das Makefile, mit dem OS-Bildbefehl Kommentare markiert mit:
C_SOURCES = $(wildcard kernel/*.c drivers/*.c)
HEADERS = $(wildcard kernel/*.h drivers/*.h)
OBJ = ${C_SOURCES:.c=.o}
all: os-image
########################################
os-image: boot/boot_sect.bin kernel.bin
copy /b $<+kernel.bin os-image
########################################
%.o : %.c ${HEADERS}
gcc -ffreestanding -c $< -o [email protected]
%.o : %.asm
nasm $< -f elf -o [email protected]
%.bin : %.asm
nasm $< -f bin -o [email protected]
kernel.bin: kernel/kernel_entry.o ${OBJ}
ld -T NUL -o kernel.tmp -Ttext 0x1000 $^
objcopy -O binary -j .text kernel.tmp kernel.bin
Dies ist, was das Verzeichnis, das ich ist das alles in aussieht wie laufen:
Dies ist der Inhalt des Boot-Verzeichnisses:
Und das ist der Inhalt des Kernel-Verzeichnis:
(das Treiber-Verzeichnis ist jetzt leer)
Dies ist der Inhalt der Datei kernel.bin:
Und dies ist der Inhalt des boot/boot_sect.bin Datei:
Die os-Image-Datei enthält jedoch den Assembly-Code?
(Ich bin mit dem Kopierbefehl mit/b)
Gibt es eine Möglichkeit, den binären Inhalt von kernel.bin verketten kann zu booten/boot_sect.bin und das Ergebnis in os-Bild speichern? Was läuft falsch?
UPDATE: Ich habe dieses Ereignis gefunden, wenn es etwas wert ist: Es ist sogar die .asm Datei obwohl ich im Befehl angegebenen .bin.
Fast alle Windows-Programme akzeptieren beide Stil von Schrägstrich. Allerdings der alte Befehl.Shell-Programme erlauben meistens keine Schrägstriche und Sie müssen Backslashes verwenden. – MadScientist