크래프톤 정글 WIL_Week 9 ~10 [PintOS] User Programs

pigpgw·2024년 10월 1일

크래프톤 정글

목록 보기
11/13
post-thumbnail

📌 학습 개요

주요 목표:

  • 사용자 프로그램 실행과 시스템 호출(System Call) 구현
  • User mode와 Kernel mode 전환 이해
  • 파일 시스템을 활용한 사용자 프로그램 실행 환경 구현

진행 방식:

  • KAIST PintOS의 Project 2 기반 학습
  • 필수 테스트 케이스 통과 및 추가 구현 사항 도전

📚 공부 키워드

1. 운영체제 핵심 개념

User mode vs Kernel mode

  • User mode:

    • 사용자 애플리케이션이 실행되는 제한된 권한 모드
    • 직접적인 하드웨어 접근 불가
    • 메모리 보호 기능 제공
  • Kernel mode:

    • 운영체제의 핵심 서비스가 실행되는 특권 모드
    • 모든 하드웨어 리소스와 시스템 메모리에 접근 가능
    • 시스템 호출, 프로세스 관리, 메모리 관리 기능 수행

System Call

  • 사용자 프로그램이 운영체제 커널 기능을 요청하기 위한 인터페이스
  • 주요 시스템 콜 종류:
    • 프로세스 제어: fork(), exec(), exit()
    • 파일 관리: open(), read(), write(), close()
    • 디바이스 관리: ioctl(), read(), write()
    • 통신: pipe(), shmget(), mmap()

Interrupt

  • CPU의 정상 실행 흐름을 중단하고 다른 작업을 처리하도록 하는 신호
  • 인터럽트 유형:
    • 하드웨어 인터럽트: 외부 장치에서 발생 (예: 키보드 입력, 마우스 클릭)
    • 소프트웨어 인터럽트: 프로그램 실행 중 발생 (예: 시스템 콜, 예외)
    • 내부 인터럽트: CPU 내부에서 발생 (예: 0으로 나누기 오류)

2. 파일 시스템 및 메모리 관리

File Descriptor

  • 유닉스 계열 시스템에서 열린 파일이나 I/O 리소스를 참조하는 추상화된 정수값
  • 주요 파일 디스크립터:
    • 0: 표준 입력 (stdin)
    • 1: 표준 출력 (stdout)
    • 2: 표준 에러 (stderr)

User Stack

  • 사용자 모드에서 함수 호출 정보를 저장하는 스택
  • 스택 프레임 구조:
    • 반환 주소
    • 이전 프레임 포인터
    • 지역 변수
    • 함수 매개변수

Segmentation Fault

  • 잘못된 메모리 접근으로 인한 예외 발생
  • 주요 원인:
    • 널 포인터 참조
    • 배열의 범위를 벗어난 접근
    • 스택 오버플로우
    • 해제된 메모리 접근

3. 저수준 시스템 작동 이해

rax Register

  • x86-64 아키텍처에서 함수 반환 값 저장
  • 주요 용도:
    • 함수 호출 결과 저장
    • 시스템 콜 번호 및 반환 값 저장
    • 산술 및 논리 연산 결과 저장

32-bit vs 64-bit OS

특징32-bit OS64-bit OS
메모리 주소 지정최대 4GB이론상 16EB
레지스터 크기32비트64비트
성능상대적으로 낮음높음
호환성대부분의 레거시 소프트웨어와 호환최신 소프트웨어 지원

📖 읽어야 할 자료

  • CS:APP:
    • Chapter 8.2 ~ 8.4: Process, System Call Error Handling, Process Control
    • Chapter 9: Virtual Memory
  • OSTEP (운영체제: 아주 쉬운 세 가지 이야기):
  • KAIST PintOS Assignment:

💻 과제 진행 방법

1. 개발 환경 구성

  • AWS EC2 Ubuntu 18.04를 사용해 환경 설정
  • 필수 패키지 설치:
    $ sudo apt update
    $ sudo apt install -y gcc make qemu-system-x86 python3

2. GitHub Repository 설정

  • PintOS 공식 저장소를 팀 저장소로 복제:
    $ git clone --bare https://github.com/casys-kaist/pintos-kaist.git
    $ cd pintos-kaist.git
    $ git push --mirror https://github.com/${팀ID}/pintos-kaist.git
    $ cd ..
    $ rm -rf pintos-kaist.git
    $ git clone https://github.com/${팀ID}/pintos-kaist.git

3. PintOS 초기 설정

  • PintOS 활성화 및 테스트:
    $ cd pintos-kaist
    $ source ./activate
    $ cd userprog
    $ make check
  • 정상 실행 시 대부분의 테스트 실패 출력
    • 이후 테스트 케이스를 통과하도록 코드 구현

4. 필수 구현 항목

  • userprog 디렉토리에서 다음 테스트를 통과하도록 구현
    • System Call Tests:
      • args-none, args-single, args-multiple, halt, exit
    • File System Tests:
      • create-normal, open-normal, write-normal
    • Process Control Tests:
      • fork-once, exec-once, wait-simple
    • Bad Memory Access Tests:
      • bad-read, bad-write, bad-jump

✅ 이번 주차 주요 목표

  • 인자 전달 메커니즘 구현 및 디버깅
  • 사용자 프로그램 실행 흐름 분석 및 트러블슈팅
  • 커널과 사용자 프로그램 간의 인터페이스 강화

💡 참고:

profile
https://www.pigpgw.cloud 로 이전합니다~

0개의 댓글