Linux Ubuntuで「フルスクラッチで作る! x86_64自作OS」を見ながら、OSを作っているのですが、2.6のQEMUで実行今やっているのですが、本通りにやっていたのですが、警告が出てしまってQEMUが起動されません。
エラーメッセージ
WARNING: Image format was not specified for 'json:{"fat-type": 0, "dir": "fs", "driver": "vvfat", "floppy": false, "rw": false}' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions. qemu-system-x86_64: Initialization of device ide-hd failed: Block node is read-only
開発言語 : C ・ リンカスクリプト
開発環境
- Linux Ubuntu 20.04 LTS
ソースコード
<main.c>
C
#define BG_RED 0 #define BG_GREEN 255 #define BG_BLUE 0 struct pixelformat { unsigned char b; unsigned char g; unsigned char r; unsigned char _reserved; }; struct framebuffer { struct pixelformat *base; unsigned long long size; unsigned int hr; unsigned int vr; }; void start_kernel(void *_t __attribute__ ((unused)), struct framebuffer *fb, void *_fs_start __attribute__ ((unused))) { unsigned int x, y; struct pixelformat *p; for (y = 0; y < fb->vr; y++) { for (x = 0; x < fb->hr; x++) { p = fb->base + (fb->hr * y) + x; p->r = BG_RED; p->g = BG_GREEN; p->b = BG_BLUE; } } while (1); }
<kernel.ld>
ld
OUTPUT_FORMAT("binary"); MEMORY { exec_file(r) : ORIGIN = 0x00000000, LENGTH = 1m ram(wx) : ORIGIN = 0x00110000, LENGTH = 960k } SECTIONS { .header : { QUAD(__bss_start) QUAD(__bss_end - __bss_start) } > exec_file .body : { *(.text) *(.rodata) *(.data) __bss_start = .; *(.bss) __bss_end = .; *(.eh_frame) } > ram AT> exec_file }
<Makefile>
make
TARGET = kernel.bin CFLAGS = -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-common LDFLAGS = -Map kernel.map -s -x -T kernel.ld $(TARGET): main.o ld $(LDFLAGS) -o $@ $+ %.o: %.c gcc $(CFLAGS) -c -o $@ $< run: $(TARGET) cp $(TARGET) ../fs/ qemu-system-x86_64 -m 4G -bios OVMF.fd -hda fat:../fs clean: rm -f *~ *.o *.map $(TARGET) .PHONY: run clean
<ディレクトリ構成>
fs / kernel.bin fs / EFI / BOOT / BOOTX64.EFI
<ファイルの作成方法>
kernel.bin :
- main.C
- kernel.ld
- Makefile
上記3つのファイルを作り、MakefileのあるディレクトリでTerminalに
Terminal
cd <Makefileのあるディレクトリパス> make
そうすると
- kernel.bin
- kernel.map
- main.o
上記3つのファイルが生成されます。
そうしたら、kernel.binの作成は終わったので、ファイルをディレクトリ構成どおりにファイルを配置して、Terminalで
Terminal
qemu-system-x86_64 -bios OVMF.fd -hda fat:fs
を実行すると、一番最初のエラーが表示されます。
わかる人がいれば教えていただきたいです。
Teratailを初めて使うので、見にくかったりするかと思いますがご了承ください。
長文失礼しました。
まだ回答がついていません
会員登録して回答してみよう