← Projects

KFS

Multiboot2 부팅·higher-half 페이징·키보드 입력·VGA 출력을 연결한 x86 커널

기간
2022.07 – 2023.12
인원
2명
역할
커널 부팅 · 메모리 · 터미널 구현
기술
C · Assembly · GNU linker

부팅부터 명령 입력까지 이어지는 커널

  • 운영체제가 제공하는 실행 환경을 직접 구성하는 2인 팀 프로젝트
  • 어셈블리 진입점에서 C 커널 초기화·메모리 매핑·하드웨어 입출력까지 구현

페이징 전환과 하드웨어 접근

  • 커널의 물리 적재 주소와 가상 실행 주소가 달라 페이징 전환 전후의 명령어·스택·화면 메모리 매핑 필요
  • 표준 입출력을 제공하는 운영체제 없이 키보드와 화면 장치에 직접 접근할 경로 필요

주소 매핑과 장치 입출력 구현

  • Multiboot2 헤더·어셈블리 진입점·초기 스택을 구성하고 kernel_main()으로 제어 전달
  • linker.ld에서 가상 주소와 적재 주소를 분리하고 0x80000000 오프셋의 higher-half 배치 적용
  • 동일 페이지 테이블을 낮은 영역과 높은 영역에 연결해 전환 구간의 메모리 접근 유지
  • CR3에 페이지 디렉터리의 물리 주소 등록 → CR0 paging bit 활성화 → 높은 주소로 분기
  • 키보드 상태 포트를 polling하고 inb()로 읽은 scancode를 문자로 변환
  • VGA 물리 메모리 0xB8000을 매핑해 문자·색상 기록, 줄바꿈·스크롤과 outb() 기반 커서 갱신 구현

기본 커널 터미널과 부트 정보 처리

  • VGA 출력·키보드 입력·reboot를 연결한 kfs$ 명령 루프 구현
  • Multiboot 메모리 맵·ELF 심볼 파싱 및 GDT descriptor 구성 코드 작성
  • GDT 초기화와 부트 정보 파싱 호출은 현재 kernel_main()에서 주석 처리된 상태로, 기본 실행 경로와 구분

부팅에서 터미널까지의 실행 경로

  • GRUB → 어셈블리 부트 코드·페이징·스택 설정 → kernel_main() → 키보드 입력·VGA 출력·명령 처리
GRUB에서 boot.s와 kernel_main을 거쳐 명령 루프로 이어지는 KFS 구조. 명령 루프는 키보드 입력, VGA 출력, reboot 기능을 호출합니다.
boot.s·linker.ld의 주소 배치와 커널 실행·호출 경로