송상록 (strawberry-tree)

Pintos 운영체제 구현

기간: 2025.07. - 2025.08.
크래프톤 정글 9기

교육용 운영체제 Pintos의 쓰레드, 시스템 콜, 가상 메모리 관련 기능을 구현

C

프로젝트 개요

Stanford 대학의 교육용 운영체제 Pintos를 기반으로 쓰레드 관리, 시스템 콜, 가상 메모리 시스템을 직접 구현하는 프로젝트입니다. 디버깅 과정에서 운영체제가 작동하는 전체 그림을 깊이 이해할 수 있었습니다. C언어를 사용하면서 강타입 언어에 익숙해지는 계기도 되었습니다.

문제 해결

1. Fork 예외 처리

문제: Fork 시스템 콜 발생 시, 부모 프로세스는 자식 프로세스 생성을 요청한 후 세마포어로 대기합니다. 자식이 부모의 자원을 복제하는 중에 실패해 종료되더라도, 부모는 자식의 성공 여부를 알 수 없어 이미 종료된 프로세스의 ID를 반환하는 문제가 발생했습니다.

해결: 부모-자식 프로세스 간 공유 구조체에 성공 플래그를 두어 상태를 전달했습니다. 자식이 모든 복제 작업을 완료했을 때만 성공으로 표시하고, 부모는 세마포어에서 깨어난 후 이 플래그를 확인해 실패를 감지합니다.

추가 설명 - Fork 예외 처리

2. 페이지 폴트 시 스택 확장

문제: 가상 메모리 시스템에서 스택 영역에 접근할 때 페이지가 할당되지 않았으면 페이지 폴트가 발생합니다. 이때 큰 배열을 스택에 할당하면 스택 포인터가 여러 페이지를 한 번에 건너뛸 수 있는데, 테스트에서 65536바이트(16페이지)를 한 번에 요구하는 경우가 있었습니다. 기존엔 push 명령어의 존재 때문에 8바이트 단위로만 푸시가 이루어지므로 페이지 1개만 할당하면 된다고 생각했으나, 오개념이였습니다.

해결: 페이지 폴트 핸들러에서 폴트가 발생한 주소부터 시작해, 이미 할당된 스택 영역에 도달할 때까지 페이지를 반복적으로 할당하는 방식으로 구현했습니다.

추가 설명 - 스택 확장