3

この youtubeチュートリアルに基づいて、画面にテキストを出力する基本的なオペレーティング システムを作成しました。チュートリアルで使用されている方法は、C ではなく C++ を使用しているため、かなり複雑です (推測します)。Grub メニューで OS を選択すると、メニューは閉じますが、画面は紫色のままです。画面にテキストは出力されません。コードがチュートリアルと一致することを再確認しましたが、彼のマシンと同じようには機能しません。

関連ハードウェア:

CPU: Ryzen 5 2600
MOBO: Asrock B450-M HDV

ファイルはかなり小さく、以下に含まれています。

カーネル.cpp :

void printf(char* str) {
    unsigned short* VideoMemory = (unsigned short*)0xb8000;

    for(int i = 0; str[i] != '\0'; ++i) {
        VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
    }
}


extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber) {
    printf("Hello World!");

    while(1);
}

loader.s : (C++ は実行前にスタック ポインタが設定されることを想定しているため)

.set MAGIC, 0x1badb002
.set FLAGS, (1<<0 | 1<<1)
.set CHECKSUM, -(MAGIC + FLAGS)

.section .multiboot
    .long MAGIC
    .long FLAGS
    .long CHECKSUM

.section .text
.extern kernelMain
.global loader

loader:
    mov $kernel_stack, %esp
    push %eax
    push %ebx
    call kernelMain

_stop:
    cli
    hlt
    jmp _stop

.section .bss
.space 2*1024*1024; # 2 MB
kernel_stack:

linker.ld :

ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS {
    . = 0x0100000;

    .text : {
        *(.multiboot)
        *(.text*)
        *(.rodata)
    }

    .data : {
        start_ctors = .;
        KEEP(*(.init_array));
        KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )))
        end_ctors = .;

        *(.data)
    }

    .bss : {
        *(.bss)
    }

    /DISCARD/ : {
        *(.fini_array*)
        *(.comment)
    }
}

メイクファイル:

GPPPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASPARAMS = --32
LDPARAMS = -melf_i386
objects = loader.o kernel.o

%.o: %.cpp
    g++ $(GPPPARAMS) -o $@ -c $<

%.o: %.s
    as $(ASPARAMS) -o $@ $<


mykernel.bin: linker.ld $(objects)
    ld $(LDPARAMS) -T $< -o $@ $(objects)

install: mykernel.bin
    sudo cp $< /boot/mykernel.bin
4

0 に答える 0