Operating systems · 42 Seoul
KFS
Multiboot2 부팅·higher-half 페이징·키보드 입력·VGA 출력을 연결한 x86 커널
프로젝트 소개
부팅부터 명령 입력까지 이어지는 커널
- 운영체제가 제공하는 실행 환경을 직접 구성하는 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 출력·명령 처리