最近、私は自分自身の本当に本当に基本的なOSを書くことに興味を持つようになりました。私はスタックを確立し、いくつかの基本的なことを行ういくつかの基本的なアセンブリを作成しました(まあ、コピーしました)。これはうまくいくように見えましたが、Cをミックスに導入しようとするとすべてが台無しになりました。
2つの主要なプロジェクトファイルがあります。スタックを作成してC関数を呼び出すNASMであるloader.sと、基本的なC関数を含むkernel.cです。
現時点での私の問題は、基本的に、kernel.binファイルを実行するとQEMUがフリーズすることです。私のコードにはいくつもの問題があると思います-おそらくこの質問は、その極端な特異性のためにStackOverflow形式には実際には適切ではありません。私のプロジェクトファイルは次のとおりです。
loader.s:
BITS 16 ; 16 Bits
extern kmain ; Our 'proper' kernel function in C
loader:
mov ax, 07C0h ; Move the starting address [7C00h] into 'ax'
add ax, 32 ; Leave 32 16 byte blocks [200h] for the 512 code segment
mov ss, ax ; Set 'stack segment' to the start of our stack
mov sp, 4096 ; Set the stack pointer to the end of our stack [4096 bytes in size]
mov ax, 07C0h ; Use 'ax' to set 'ds'
mov ds, ax ; Set data segment to where we're loaded
mov es, ax ; Set our extra segment
call kmain ; Call the kernel proper
cli ; Clear ints
jmp $ ; Hang
; Since putting these in and booting the image without '-kernel' can't find
; a bootable device, we'll comment these out for now and run the ROM with
; the '-kernel' flag in QEMU
;times 510-($-$$) db 0 ; Pad remained of our boot sector with 0s
;dw 0xAA55 ; The standard 'magic word' boot sig
kernel.c:
#include <stdint.h>
void kmain(void)
{
unsigned char *vidmem = (char*)0xB8000; //Video memory address
vidmem[0] = 65; //The character 'A'
vidmem[1] = 0x07; //Light grey (7) on black (0)
}
私はそのようにすべてをコンパイルします:
nasm -f elf -o loader.o loader.s
i386-elf-gcc -I / usr / include -o kernel.o -c kernel.c -Wall -nostdlib -fno-builtin -nostartfiles -nodefaultlibs
i386-elf-ld-Tリンカー.ld-okernel.binloader.o kernel.o
そして、そのようにテストします:
qemu-system-x86_64 -kernel kernel.bin
誰かが私のためにこれを見てくれることを願っています-コードスニペットはそれほど長くはありません。
ありがとう。