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
1#define BG_RED 0 2#define BG_GREEN 255 3#define BG_BLUE 0 4 5struct pixelformat { 6 unsigned char b; 7 unsigned char g; 8 unsigned char r; 9 unsigned char _reserved; 10}; 11 12struct framebuffer { 13 struct pixelformat *base; 14 unsigned long long size; 15 unsigned int hr; 16 unsigned int vr; 17}; 18 19void start_kernel(void *_t __attribute__ ((unused)), struct framebuffer *fb, 20 void *_fs_start __attribute__ ((unused))) 21{ 22 unsigned int x, y; 23 struct pixelformat *p; 24 25 for (y = 0; y < fb->vr; y++) { 26 for (x = 0; x < fb->hr; x++) { 27 p = fb->base + (fb->hr * y) + x; 28 p->r = BG_RED; 29 p->g = BG_GREEN; 30 p->b = BG_BLUE; 31 } 32 } 33 34 while (1); 35} 36
<kernel.ld>
ld
1OUTPUT_FORMAT("binary"); 2 3MEMORY 4{ 5 exec_file(r) : ORIGIN = 0x00000000, LENGTH = 1m 6 ram(wx) : ORIGIN = 0x00110000, LENGTH = 960k 7} 8 9SECTIONS 10{ 11 .header : { 12 QUAD(__bss_start) 13 QUAD(__bss_end - __bss_start) 14 } > exec_file 15 16 .body : { 17 *(.text) 18 19 *(.rodata) 20 21 *(.data) 22 23 __bss_start = .; 24 *(.bss) 25 __bss_end = .; 26 27 *(.eh_frame) 28 } > ram AT> exec_file 29}
<Makefile>
make
1TARGET = kernel.bin 2CFLAGS = -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-common 3LDFLAGS = -Map kernel.map -s -x -T kernel.ld 4 5$(TARGET): main.o 6 ld $(LDFLAGS) -o $@ $+ 7 8%.o: %.c 9 gcc $(CFLAGS) -c -o $@ $< 10 11run: $(TARGET) 12 cp $(TARGET) ../fs/ 13 qemu-system-x86_64 -m 4G -bios OVMF.fd -hda fat:../fs 14 15clean: 16 rm -f *~ *.o *.map $(TARGET) 17 18.PHONY: run clean
<ディレクトリ構成>
fs / kernel.bin fs / EFI / BOOT / BOOTX64.EFI
<ファイルの作成方法>
kernel.bin :
- main.C
- kernel.ld
- Makefile
上記3つのファイルを作り、MakefileのあるディレクトリでTerminalに
Terminal
1cd <Makefileのあるディレクトリパス> 2make
そうすると
- kernel.bin
- kernel.map
- main.o
上記3つのファイルが生成されます。
そうしたら、kernel.binの作成は終わったので、ファイルをディレクトリ構成どおりにファイルを配置して、Terminalで
Terminal
1qemu-system-x86_64 -bios OVMF.fd -hda fat:fs
を実行すると、一番最初のエラーが表示されます。
わかる人がいれば教えていただきたいです。
Teratailを初めて使うので、見にくかったりするかと思いますがご了承ください。
長文失礼しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。