-
핀토스 다시 하기programming/pintos 2018. 12. 28. 22:13
다시, 핀토스
작년 운영체제 수업에서 과제로 핀토스 프로젝트를 진행했다. 간단한 운영체제를 구현하는 프로젝트였다. 아무 것도 없는 백지에서 시작하는 것은 아니었고, 어느 정도의 뼈대 소스코드와 무엇을 구현해야하는 지를 알려주는 지시는 주어졌다. 어셈블리도 전혀 모르는 상태였고, 운영체제를 처음 공부하는 학기이다 보니 수업 진도를 따라가기도 벅찼다. 핀토스 프로젝트는 상당히 고달픈 과제였고, 결국은 내 힘으로 완성하지 못했다.
그로부터 일년이 지났고, 그 뒤로 컴퓨터 아키텍처 수업도 두 개를 더 들었다. 운영체제 수업과 여기저기 겹치는 부분이 많은 수업들이었다. 반복해서 배우고 더 배우다 보니, 스레드와 프로세스, 가상 메모리, 파일 시스템 등 핀토스에서 요구하는 구현 요소에 관해 좀 더 이해할 수 있었다.
시간이 나면 그때 다 못한 핀토스 프로젝트를 끝까지 완성하고 싶다는 생각이 들었다. 쉽지 않고 상당히 고통스러운 프로젝트이지만, 지나간 수업이라고 엉망인 내 소스코드를 그냥 그렇게 묻고 가기는 싫었다.
8번째 학기가 끝났고, 아직 인턴을 시작하기까지는 며칠의 여유가 있고, 낮 최고기온이 영하 4도인 날씨에서 이불 밖은 위험하다. 가만히 집 안에만 있자니 심심하다. 그래서 묻어둔 핀토스를 다시 꺼내기로 했다.
일의 순서
핀토스는 원래 스탠포드 대학교 컴퓨터과학과에서 과제로 진행하는 프로젝트이다. 스탠포드에서는 다음과 같이 네 번에 걸쳐 프로젝트를 진행한다.
- (과제 1) 스레드: 기초적인 스레드 시스템을 구현한다. 적절한 동기화을 통한 타이머와 스케줄링 구현을 요구한다.
- (과제 2) 유저 프로그램: C로 작성해 컴파일한 유저 프로그램이 핀토스 상에서 구동될 수 있도록 커널을 개발한다. 인수 전달, 유저 메모리 접근, 시스템 콜을 구현할 것을 요구한다.
- (과제 3) 가상 메모리: 기초적인 가상 메모리 시스템을 구현한다. 페이지 테이블과 메모리 맵을 구현하고 페이지 폴트, 스택 확장를 처리할 것을 요구한다.
- (과제 4) 파일 시스템: 이미 구현된 매우 기초적인 파일 시스템을 확장한다. 버퍼 캐시와 서브디렉터리를 구현하고, 파일이 여러 블록에 걸칠 수 있도록 해야 한다.
우리 학교 운영체제 수업에서는 순서를 조금 다르게 하고, 요구하는 구현 요소가 조금 적다. 다음과 같다. (내가 수강한 2017년 2학기 기준이며, 이후로 변화가 있을 수 있다.)
- 핀토스 설치: 핀토스를 가상머신 상에 설치하여 뼈대 코드가 정상적으로 구동하는 것을 확인한다.
- 핀토스 자료 구조 확장: 핀토스 커널에 이미 구현된 리스트, 해시테이블, 비트맵 자료구조에 몇 가지 기능을 추가할 것을 요구한다. (실제 핀토스 구동에 필요한 기능은 전혀 아니고, 핀토스에서 쓰이는 자료구조에 익숙해지라고 시키는 과제로 보인다.)
- (과제 2) 유저 프로그램: 과제 1(스레드)에 앞서 과제 2(유저 프로그램)를 먼저 구현 시킨다. 스탠포드의 원래 과제에서도 이 두 부분은 순서가 바뀌어도 상관이 없다고 나와있다. 먼저 인수 전달을 구현해야 하고, 파일 시스템과 관련 없는 일부 시스템 콜의 구현을 요구한다. 원래 유저 프로그램 과제로 요구하는 76개의 테스트 중 21개를 통과해야 한다.
- (과제 2) 유저 프로그램: 앞서 구현하지 않은 파일 시스템 관련 시스템 콜을 구현한다. 프로그램 실행 중 실행 파일에 대한 쓰기를 막는 기능을 구현한다. 56개의 테스트를 통과해야 한다.
- (과제 1) 스레드: 원래의 스레드 과제와 동일하지만, BSD 스케줄러의 구현은 필수가 아니며 추가 점수를 얻을 수 있는 부분이다.
- (과제 3) 가상 메모리: 원래의 가상 메모리 과제에서 많은 부분을 생략하고, 페이지 테이블 구현과 페이지 폴트, 스택 확장만 처리하면 된다.
과제 4(파일 시스템)는 아예 요구하지 않는다.
이 블로그에서는 이런 순서로 핀토스 구현을 진행하고자 한다.
- 핀토스 설치: 핀토스를 가상머신 상에 설치하여 뼈대 코드가 정상적으로 구동되는 것을 확인한다.
- (과제 1) 스레드: BSD 스케줄러를 제외한 과제 1을 모두 해결한다.
- (과제 1) 스레드: BSD 스케줄러를 구현한다. 과제 1에 해당하는 테스트를 모두 통과한다.
- (과제 2) 유저 프로그램: 스레드 과제가 구현되지 않은 뼈대 코드에서 시작하여, 인수 전달을 구현한다. 파일 시스템과 관련 없는 시스템 콜을 모두 구현한다.
- (과제 2) 유저 프로그램: 파일 시스템 관련 시스템 콜을 구현한다. 프로그램 실행 중 실행 파일에 대한 쓰기를 막는 기능을 구현한다. 과제 2에 해당하는 테스트를 모두 통과한다.
- (과제 2) 스레드 과제와 유저 프로그램 과제의 구현물을 통합한다. 과제 1과 과제 2에 해당하는 테스트를 모두 통과한다.
- (과제 3) 가상 메모리: 페이지 테이블 구현과 페이지 폴트, 스택 확장을 처리한다.
- (과제 3) 가상 메모리: 메모리 맵을 포함하여 과제 3번을 모두 해결한다. 과제 3에 해당하는 테스트를 모두 통과한다.
- (과제 4) 파일 시스템: 과제 4를 모두 해결하고, 해당하는 테스트를 모두 통과한다.
구체적인 진행 일정은 확정하기 어렵다. 하나씩 되는대로, 진행하는대로 로그를 작성하고 각 단계가 완료되면 깃허브에 업로드한다. 일단은 본격적인 진행에 앞서 우선 낡은 노트북에 우분투를 설치하고 필요한 프로그램을 설치해야 한다.
"Ford Pinto" by Morven is licensed under CC BY-SA 3.0. 'programming > pintos' 카테고리의 다른 글
핀토스 설치하기 (0) 2018.12.31 핀토스 코드 비교 정리 (0) 2018.12.31 댓글