미새문지

Pintos-kaist Guide - INTRODUCTION 본문

Pintos-Kaist Guide Gitbook

Pintos-kaist Guide - INTRODUCTION

문미새 2024. 3. 18. 15:51
728x90

Introduction

KAIST CS330의 핀토스 프로젝트에 오신 것을 환영합니다. 이번 학기에는 카이스트 CS330 과목에 적합하도록 특별히 수정된 핀토스 버전을 사용할 예정입니다.

이 수정된 버전은 기존의 핀토스와 일부 요구 사항이 다르기 때문에, 본 설명서의 지침을 우선적으로 따라야 합니다. 이전 핀토스 프로젝트를 참고할 수는 있지만, 업데이트된 프로젝트의 요구 사항에 맞춰 일부 기능을 재구현해야 할 수도 있습니다.

 

변경 사항으로 인해 교수님이 설명서를 업데이트해야 했습니다. 교수님이 수정된 버전과 설명서를 최대한 일치시키려 노력했지만, 동기화되지 않은 부분이 있을 수 있습니다. 이런 부분을 발견하시면 교수님께 바로 알려주시기 바랍니다.

또한, 법적 및 윤리적 문제에 대한 섹션은 반드시 확인하셔야 합니다.

 

pintos-kaist는 x86-64 아키텍처를 위한 간결한 운영 체제 프레임워크입니다. 이 프로젝트는 스탠포드 대학의 핀토스 프로젝트에서 파생되었습니다.

Pintos는 커널 스레드, 사용자 프로그램의 로드 및 실행, 파일 시스템 지원 등을 매우 기본적인 방식으로 구현합니다. 프로젝트를 통해 여러분과 여러분의 팀은 이러한 세 가지 영역 모두에서 지원을 강화하고, 추가로 가상 메모리 구현도 도입할 예정입니다.

 

이론적으로는 일반 x86-64 PC에서 핀토스를 실행할 수 있지만, 모든 CS330 수강생에게 개별 PC를 제공하는 것은 현실적으로 불가능합니다. 그래서 우리는 시스템 시뮬레이터, 즉 QEMU를 사용하여 프로젝트를 실행할 것입니다. 이는 x86-64 CPU와 주변 장치를 정밀하게 시뮬레이션하여, 수정되지 않은 운영 체제와 소프트웨어가 실행될 수 있도록 합니다.

이 프로젝트는 꽤 도전적입니다. CS330은 그 명성에 걸맞게 시간이 많이 소요되는 과목입니다. 우리는 여러분의 작업 부담을 줄이기 위해 많은 지원 자료를 제공할 계획이지만, 여전히 해야 할 일이 많습니다. 여러분의 피드백은 언제나 환영입니다. 과제의 불필요한 부담을 줄이고, 더 중요한 핵심 문제에 집중할 수 있는 방법에 대한 제안이 있으시다면 주저하지 말고 알려주시기 바랍니다. 이 장에서는 핀토스 작업을 시작하는 방법에 대해 설명합니다. 프로젝트 작업을 시작하기 전에, 이 장을 전체적으로 꼼꼼히 읽어보시기 바랍니다.


Getting Started

시작하기 전에, 핀토스를 빌드하기 위해 지정된 머신에 로그인해야 합니다. 인스트럭터가 제공한 Linux 머신을 사용하거나, 개인적으로 Solaris 또는 Linux 머신을 준비할 수도 있습니다. 그러나 강좌에서는 주어진 머신에서 코드 테스트를 진행할 예정이며, 이 지침은 해당 환경에 맞춰 제공됩니다. 본인의 머신에 핀토스를 설치하고 작업하는 경우, 추가적인 지원은 제공되지 않습니다. 각 학생에게 할당된 서버 환경에 대한 정보는 다음과 같습니다.

 

이 명령어를 실행하여 Pintos의 소스 코드를 디렉터리 이름 'pintos'에 가져올 수 있습니다:

git clone https://github.com/casys-kaist/pintos-kaist

 

그러나 프로젝트 기간 전에 소스 코드가 변경될 가능성이 높기 때문에, repository를 복제하는 것이 좋습니다. 이렇게 하면 템플릿 코드에 변화가 있을 경우, 여러분의 코드를 템플릿과 쉽게 동기화할 수 있게 됩니다. 단, pubilc fork는 생성하지 않도록 주의해주세요. 프로젝트 기간 동안에는, 템플릿 코드에 심각한 버그가 발견되지 않는 한, 소스 코드를 변경하지 않습니다.

 

알아두세요. 우리는 주어진 리눅스 머신에서와 동일한 gcc(gcc (Ubuntu 7.4.0-1ubuntu1~16.04~ppa1) 7.4.0) 및 qemu-system-x86_64 (QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.43))를 사용하여 우분투 16.04.6 LTS에서 핀토스 코드와 솔루션을 테스트했습니다.

 

소스 코드를 다운로드한 후에는, pintos 루트 디렉터리에서 아래 명령어를 통해 환경을 설정할 수 있습니다:

$ source ./activate

 

이 줄을 홈 디렉터리의 '.bashrc'에 추가하는 것이 좋습니다. 그렇지 않으면 로그인할 때마다 입력해야 합니다.

 

Source Tree Overview

내부 구조를 살펴보면, pintos/ 디렉터리 내에는 다음과 같은 구조로 구성되어 있습니다.

  • threads/: 이 디렉터리는 프로젝트 1부터 시작하여 수정해야 할 기본 커널 소스 코드를 포함하고 있습니다.
  • userprog/: 사용자 프로그램 로더의 소스 코드가 들어 있으며, 프로젝트 2부터 수정 작업이 시작됩니다.
  • vm/: 이 디렉터리는 처음에는 거의 비어 있으나, 프로젝트 3에서 가상 메모리 구현을 위해 사용됩니다.
  • filesys/: 기본 파일 시스템의 소스 코드가 들어 있습니다. 프로젝트 2부터 이 파일 시스템을 사용하게 되지만, 프로젝트 4까지는 수정하지 않습니다.
  • devices/: 키보드, 타이머, 디스크 등의 I/O 장치 인터페이스를 위한 소스 코드가 포함되어 있습니다. 프로젝트 1에서는 타이머 구현을 수정하지만, 그 외에는 변경할 필요가 없습니다.
  • lib/: 표준 C 라이브러리의 일부를 구현한 코드가 포함되어 있으며, 이 코드는 핀토스 커널과 프로젝트 2 이하에서 실행되는 사용자 프로그램 모두에 컴파일됩니다. 거의 수정할 필요가 없습니다.
  • include/lib/kernel/: 핀토스 커널 전용 C 라이브러리의 일부로, 커널 코드에서 사용할 수 있는 다양한 데이터 유형(비트맵, 이중 링크 목록, 해시 테이블 등)의 구현을 포함합니다. 커널 코드에서는 이 디렉터리의 헤더 파일을 #include <...> 방식으로 포함할 수 있습니다.
  • include/lib/user/: 핀토스 사용자 프로그램 전용 C 라이브러리의 일부로, 사용자 프로그램에서는 이 디렉터리의 헤더 파일을 #include <...> 방식으로 포함할 수 있습니다.
  • tests/: 각 프로젝트의 테스트 코드가 포함되어 있으며, 제출 전에 도움이 되는 경우 이 코드를 수정할 수 있지만, 테스트 실행 전에는 원본 상태로 복원해야 합니다.
  • examples/: 프로젝트 2부터 사용할 수 있는 예제 사용자 프로그램이 포함되어 있습니다.
  • include/: 헤더 파일(*.h) 소스 코드가 포함되어 있습니다.

 

Building Pintos

첫 번째 프로젝트를 위해 제공된 소스 코드를 빌드하는 과정은 다음과 같습니다.

먼저, 'threads' 디렉토리로 이동하여 'make' 명령을 실행합니다. 이 과정을 통해 'threads' 디렉토리 아래에 'build' 디렉터리가 생성되며, 여기에는 'Makefile'과 여러 하위 디렉토리가 포함되어 있습니다. 이 디렉토리들은 커널을 빌드하는 데 필요한 모든 것을 담고 있습니다.

빌드가 완료되면, 'build' 디렉토리 안에서 특히 주목할 만한 몇 가지 파일이 생깁니다:

  • Makefile
    • 이는 'pintos/src/Makefile.build'의 복사본으로, 커널을 어떻게 빌드할지에 대한 지침을 담고 있습니다.
  • kernel.o
    • 이는 커널의 전체 오브젝트 파일로, 개별 커널 소스 파일들이 컴파일되어 하나의 오브젝트 파일로 합쳐진 결과입니다. 디버그 정보를 포함하고 있어 GDB 사용이나 백트레이스 실행에 유용합니다.
  • kernel.bin
    • 이는 커널의 메모리 이미지 즉, 핀토스 커널이 메모리에 로드되어 실행되기 위한 실제 바이트입니다. 디버그 정보가 제거되어 'kernel.o'보다 훨씬 적은 공간을 차지합니다. 또한 커널 로더의 설계 덕분에 512kB의 크기 제한을 넘지 않습니다.
  • loader.bin
    • 이는 커널 로더의 메모리 이미지로, 디스크에서 커널을 메모리로 읽어와 시작하는 작은 어셈블리 언어 코드입니다. 이 파일의 크기는 정확히 512바이트로, PC BIOS에 의해 설정된 크기입니다.
    • 또한, 빌드의 하위 디렉터리들은 컴파일러가 생성한 객체 파일(.o)과 종속성 파일(.d)을 포함합니다. 종속성 파일들은 다른 소스 파일이나 헤더 파일에 변경이 있을 때 어떤 소스 파일을 다시 컴파일해야 하는지를 알려주는 역할을 합니다.

 

Running Pintos

핀토스를 시뮬레이터에서 쉽게 사용할 수 있게 해주는 방법에 대해 알아보겠습니다. 가장 기본적인 사용 예로, 핀토스는 특정 인수들과 함께 호출될 수 있으며, 이 인수들은 핀토스 커널로 전달되어 지정된 동작을 수행하게 합니다.

  1. 시작하기: 먼저, 새로 만든 빌드 디렉터리로 이동합니다.
  2. Pintos 실행: 이후, pintos -- run alarm-multiple 명령을 입력합니다. 여기서, run은 커널에게 테스트를 실행하라고 지시하며, alarm-multiple은 실행할 테스트의 이름을 나타냅니다. 이 명령을 실행하면, 핀토스가 부팅되고, alarm-multiple 테스트 프로그램이 실행되어 결과를 텍스트 형태로 출력합니다.

 

이 과정을 통해, 핀토스를 활용하여 다양한 테스트를 실행하고 그 결과를 확인할 수 있습니다. 간단한 명령어 입력만으로 핀토스의 강력한 기능을 경험할 수 있게 됩니다.

명령줄에서 리디렉션을 통해 직렬 출력을 파일에 기록하는 방법, 예를 들어 pintos -- run alarm-multiple > logfile 처럼 사용할 수 있습니다. 핀토스 프로그램은 qemu 또는 가상 하드웨어를 구성하기 위한 여러 옵션을 제공합니다. 옵션을 지정할 경우, 핀토스 커널에 전달되는 명령어 앞에 --를 붙여 옵션과 명령어를 구분해야 하며, 전체 명령어는 pintos 옵션... -- 인수... 형식으로 구성됩니다.

 

사용 가능한 옵션 목록을 확인하려면 인수 없이 pintos를 실행하세요. 옵션에는 VM 출력을 표시하는 방법이 포함되어 있습니다: -v를 사용하면 VGA 디스플레이를 끌 수 있고, -s를 사용하면 stdin에서의 직렬 입력을 억제하고 stdout으로 출력할 수 있습니다.

핀토스 커널은 run 이외에도 명령어와 옵션을 가지고 있습니다. 현재로서는 크게 중요하지 않을 수 있지만, -h를 사용하여 이러한 명령어와 옵션의 목록을 볼 수 있습니다, 예를 들면 pintos -h입니다.


Grading

시험 결과에 따라 과제를 채점합니다.

 

Testing

테스트 결과 등급은 우리의 테스트에 기반하여 결정됩니다. 각 프로젝트에는 tests로 시작하는 이름을 가진 여러 테스트가 있습니다. 제출물을 완전히 테스트하려면, 프로젝트 빌드 디렉토리에서 make check를 실행하세요. 이 명령은 각 테스트를 빌드하고 실행한 후, 각각에 대해 통과 또는 실패 메시지를 출력합니다. 테스트가 실패할 경우, make check는 실패 이유에 대한 일부 세부 정보도 출력합니다. 모든 테스트를 실행한 후, make check는 테스트 결과의 요약을 출력합니다. 또한, 개별 테스트를 한 번에 하나씩 실행할 수도 있습니다. 주어진 테스트 t는 그 출력을 t.output에 기록하고, 스크립트는 출력을 평가하여 통과 또는 실패로 판정한 후 그 결과를 t.result에 기록합니다. 단일 테스트를 실행하고 평가하려면, 빌드 디렉토리에서 .result 파일을 명시적으로 만드세요.

 

예를 들어, make tests/threads/alarm-multiple.result와 같이 사용합니다. 만약 make가 테스트 결과가 최신 상태라고 하지만 어쨌든 다시 실행하고 싶다면, make clean을 실행하거나 .output 파일을 수동으로 삭제하세요. 기본적으로, 각 테스트는 실행 중이 아닌 완료 시에만 피드백을 제공합니다. 원한다면, make check VERBOSE=1처럼 make 명령어 라인에 VERBOSE=1을 지정하여 각 테스트의 진행 상황을 관찰할 수 있습니다. 모든 테스트와 관련 파일은 pintos/src/tests에 있습니다.

 

제출물을 테스트하기 전에, 올바른 테스트가 사용되도록 해당 디렉토리의 내용을 깨끗한, 수정되지 않은 복사본으로 교체할 것입니다. 따라서, 디버깅에 도움이 된다면 일부 테스트를 수정할 수 있지만, 우리는 원본을 실행할 것입니다. 모든 소프트웨어에는 버그가 있으므로, 우리의 일부 테스트에는 결함이 있을 수 있습니다. 테스트 실패가 코드의 버그가 아니라 테스트의 버그라고 생각한다면, 이를 지적해 주세요. 필요한 경우 이를 검토하고 수정하겠습니다. 우리가 제공하는 테스트 스위트의 관대함을 이용하려고 시도하지 마세요. 코드는 우리가 제공하는 테스트 케이스뿐만 아니라 일반적인 경우에도 제대로 작동해야 합니다.

 

예를 들어, 실행 중인 테스트 케이스의 이름에 기반하여 커널의 행동을 명시적으로 설정하는 것은 받아들일 수 없습니다. 테스트 케이스를 우회하려는 시도는 어떠한 점수도 받지 못할 것입니다. 솔루션이 이와 관련하여 회색 영역에 있을 수 있다고 생각된다면, 우리에게 문의해 주세요.

 

Submission

아카이브 파일을 만들기 위한 명령을 제공합니다. threads, userprog, vm, filesys 디렉토리가 있는 pintos 프로젝트 루트 디렉토리로 이동하세요.

TEAM=YOUR_TEAM_NUMBER make archive를 입력하세요(예: TEAM=5 make archive).

그러면 동일한 디렉토리에 team5.tar.gz 파일이 생성됩니다. 이 아카이브 파일을 제출하세요. 중복 제출을 하지 마세요. 팀당 하나의 제출로 충분합니다.


Legal and Ethical Issues

Pintos의 원본 버전은 자유롭게 사용, 수정, 배포할 수 있게 하는 관대한 라이선스 하에 배포됩니다. Pintos 작업을 하는 학생들과 다른 사람들은 자신이 작성한 코드를 소유하며, 이를 어떤 목적으로든 사용할 수 있습니다. 단, Pintos는 어떠한 보증도 제공하지 않으며, 상품성이나 특정 목적에의 적합성조차 보증하지 않습니다. 라이선스의 세부 사항과 보증 부족에 대해서는 라이선스 파일을 참조하십시오. 그러나 pintos-kaist의 수정된 코드는 동일한 라이선스 하에 있지 않습니다. 대신, RECEX 공유 소스 라이선스를 사용하는데, 이는 이 코드를 기반으로 한 작업을 재배포해서는 안 된다는 것을 의미합니다. 자세한 내용은 LICENSE를 참조하십시오.

 

KAIST의 CS330 과정의 맥락에서, 온라인이나 다른 곳에 있는 숙제 해답을 읽지 않음으로써 명예 코드의 정신과 글자를 존중해 주십시오. 리눅스나 FreeBSD와 같은 다른 운영 체제 커널의 소스 코드를 읽는 것은 허용되지만, 그것들에서 코드를 그대로 복사하지는 마십시오.

728x90