OS/OS from Scratch

[OS] 14. Checkpoint

jschang 2021. 6. 28. 01:35

서론

이번 강의에서는 앞으로의 강의를 진행하기 위해 코드들을 reformat 하겠습니다. 해당 Github 강의는 다음과 같습니다.

https://github.com/cfenollosa/os-tutorial/tree/master/14-checkpoint

 

cfenollosa/os-tutorial

How to create an OS from scratch. Contribute to cfenollosa/os-tutorial development by creating an account on GitHub.

github.com


이론

Monolithic/Micro Kernel

https://en.wikipedia.org/wiki/Microkernel

Monolithic Kernel은 애플리케이션을 제외한 모든 시스템 기능들이 커널의 각 영역에 들어가 있는 형태를 의미합니다. Linux Kernel이 Monolithic Kernel의 형태입니다.

반면 Micro Kernel은 Monolithic Kernel이 관리하던 시스템 기능들이 Kernel위에 서버의 형태로 존재하는 형태입니다. 이를 통해 하나의 시스템 서비스가 다운돼도 Kernel 전체에 문제가 생기지 않습니다. 대표적으로 OSX의 Darwin Kernel과 Windows의 Windows NT Kernel이 Micro Kernel입니다.


코드

Makefile

GDB 디버깅을 위해 Makefile이 수정되었습니다. 설명은 주석에 있습니다.

# kernel/<파일명>.c, drivers/<파일명>.c 파일들을 매칭
# 파일명들을 띄어쓰기로 구분된 문자열 생성 
C_SOURCES = $(wildcard kernel/*.c drivers/*.c)
HEADERS = $(wildcard kernel/*.h drivers/*.h)
# C_SOURCES의 파일명에서 마지막 .c대신 .o으로 대체
OBJ = ${C_SOURCES:.c=.o}

CC = /usr/local/i386elfgcc/bin/i386-elf-gcc
GDB = /usr/local/i386elfgcc/bin/i386-elf-gdb

# gcc의 flag
CFLAGS = -g

all: run

os-image.bin: boot/bootsect.bin kernel.bin
	cat $^ > os-image.bin

kernel.bin: boot/kernel_entry.o ${OBJ}
	i386-elf-ld -o $@ -Ttext 0x1000 $^ --oformat binary

# 디버깅 위해 생성
kernel.elf: boot/kernel_entry.o ${OBJ}
	i386-elf-ld -o $@ -Ttext 0x1000 $^

run: os-image.bin
	qemu-system-i386 -fda os-image.bin

debug: os-image.bin kernel.elf
	qemu-system-i386 -s -fda os-image.bin -S &
	${GDB} -ex "target remote localhost:1234" -ex "symbol-file kernel.elf"

# %.o: %.c .o로 끝나는 파일와 동일한 파일명의 .c파일
%.o: %.c ${HEADERS}
	${CC} ${CFLAGS} -ffreestanding -c $< -o $@

%.o: %.asm
	nasm $< -f elf -o $@

%.bin: %.asm
	nasm $< -f bin -o $@

clean:
	rm -rf *.bin *.dis *.o os-image.bin *.elf
	rm -rf kernel/*.o boot/*.bin drivers/*.o boot/*.o

실행 결과

make debug를 통해 GDB를 실행시킨 결과 GDB가 잘 작동하지 않았습니다. 이는 해당 Github 강좌의 Issue에도 언급된 문제이며 GDB 자체의 문제로 해결하기 어려운 것으로 생각됩니다.