[SW 사관학교 정글 8기] WEEK07 (PROJECT 1: THREADS)

유선·2024년 5월 5일
0

sw사관학교 정글

목록 보기
13/21
post-thumbnail

정글끝까지

📢 “여기까지 잘 오셨습니다. OS프로젝트를 시작합니다.”

OS프로젝트는 PintOS의 코드를 직접 수정해가며 진행하는 프로젝트입니다.
PintOS는 2004년 스탠포드에서 만들어진 교육용 운영체제예요. 우리 프로젝트는 이를 기반으로 KAIST 권영진 교수님 주도 하에 만들어진 KAIST PintOS로 진행됩니다.

💡 팀 별로 프로젝트 1~3을 완수해갑니다.

KAIST PintOS Assignment : https://casys-kaist.github.io/pintos-kaist/
내용은 어렵지만, 매우 상세하게 접근 방법을 기술하고 있습니다.

PROJECT 1: THREADS

[Pintos-KAIST] Project 1 : Alarm Clock
[Pintos-KAIST] Project 1 : Priority Scheduling
[Pintos-KAIST] Project 1 : Priority Scheduling and Synchronization
[Pintos-KAIST] Project 1 : Priority Donation
[Pintos-KAIST] Project 1 : Multi-Level Feedback Queue Scheduler

정리하느라 너무너무 힘들었는데 project2를 하고 있는 지금...
이때가 너무 그립다...

코치님의 말씀

OS가 hardware와 software 사이에 있는 software다 보니 hardware에 대해서 좀 알아야 이해할 수 있는 것들이 많습니다. 최소한 다음 질문에는 대답할 수 있는게 앞으로 프로젝트를 진행하는데 도움이 될 것이라 생각합니다.
(사실 CS:APP 3장을 차근차근 읽어 놨다면 아는 내용입니다.)

1. %rip, %rsp register의 의미와 CPU 동작에서의 역할

  • %rip: 명령어 포인터 레지스터로, 현재 실행 중인 명령어의 주소를 가리킨다.
  • %rsp: 스택 포인터 레지스터로, 현재 스택의 가장 위 주소를 가리킨다.

2. assembly 명령어 JMP와 CALL의 차이점

  • JMP: 프로그램의 흐름을 주어진 주소로 이동시킨다.
  • CALL: 현재 위치를 호출 스택에 저장하고, 프로그램의 흐름을 주어진 주소로 이동시킨다. 함수 호출에 주로 사용된다.

3. JMP, CALL, RET, PUSH, POP, IRET 명령에서 %rip, %rsp는 어떻게 값이 변하는가?

  • JMP: %rip는 주어진 주소로 변경된다.
  • CALL: %rip는 호출된 함수의 시작 주소로 변경되며, %rsp는 호출 스택에 값이 푸시된다.
  • RET: %rip는 호출 스택에 저장된 주소로 변경되며, %rsp는 해당 값이 팝된다.
  • PUSH: %rsp는 스택에 값을 푸시하고 변경된다.
  • POP: %rsp는 스택에서 값을 팝하고 변경된다.
  • IRET: 인터럽트 처리 후, 이전 상태로 복귀하며 %rip와 %rsp는 저장된 값으로 변경된다.

4. interrupt 발생 시 CPU는 어떻게 동작하는가? register 값 및 연관된 memory는?

  • 현재 실행 중인 명령어를 중단하고, 인터럽트를 처리하기 위해 인터럽트 서비스 루틴의 주소로 이동한다.

  • 현재의 프로세스 상태를 저장하고, 인터럽트 서비스 루틴에서 필요한 레지스터 및 메모리 상태를 설정한다.

  • 인터럽트 서비스 루틴을 실행한다.

  • 인터럽트 발생 전의 레지스터 값들은 스택에 저장된다. 보통은 프로그램 카운터(PC), 스택 포인터(SP), 그리고 다른 중요한 레지스터들의 값들이 저장된다.

  • 현재의 프로세스 상태는 스택이나 다른 메모리 영역에 저장된다. 이것은 후에 인터럽트 서비스 루틴이 종료되고 원래 프로세스로 복귀할 때 사용된다.

5. interrupt를 처리한 후에는 어떻게 되는가?

  • 인터럽트가 발생하기 전의 상태로 복귀
  • 이전에 저장된 프로세스 상태를 복원하고, 중단된 명령어의 실행을 계속한다.

6. interrupt는 어떻게 enable/disable 시킬 수 있는가? enable/disable 되면 뭐가 달라지는가?

  1. 인터럽트 플래그: 일부 CPU 아키텍처에서는 인터럽트를 허용하거나 금지하는 데 사용되는 인터럽트 플래그를 제공한다. 이 플래그는 일반적으로 특수한 상태 레지스터에 위치하며, 플래그가 설정되면 인터럽트가 허용되고, 클리어되면 인터럽트가 비활성화된다.
  2. 인터럽트 마스크 레지스터: 다른 시스템에서는 인터럽트를 각각 개별적으로 제어하는 데 사용되는 인터럽트 마스크 레지스터를 제공한다. 이 레지스터는 특정 인터럽트 번호에 대한 비트를 설정하거나 해제함으로써 해당 인터럽트를 활성화 또는 비활성화할 수 있다.
  3. 프로그램 가능한 인터럽트 컨트롤러 (PIC): 일부 시스템에서는 하드웨어적으로 인터럽트를 제어하기 위해 프로그래머블한 인터럽트 컨트롤러를 사용한다. 이러한 PIC는 특정한 명령어를 통해 인터럽트를 활성화하거나 비활성화할 수 있다.
  • 인터럽트가 disable된 상태에서는 인터럽트가 발생해도 CPU가 해당 인터럽트를 무시한다.

  • 인터럽트가 enable된 상태에서는 인터럽트가 발생하면 해당 인터럽트 서비스 루틴을 실행한다.

    • Option: NMI (Non-Maskable Interrupt)는 무엇인가?

      • 다른 일반적인 인터럽트들과는 달리 CPU가 무시할 수 없는 중요한 인터럽트이다.

      • NMI는 보통 하드웨어적인 문제나 시스템의 심각한 오류를 나타내기 위해 사용된다. 예를 들어, 메모리 에러, 전원 공급 장애, 시스템 보호 기능에 대한 경고 등과 같은 상황에서 발생할 수 있다.

      • NMI는 CPU의 작동을 중단하고, 해당 오류나 문제를 해결하기 위한 특수한 처리를 수행하기 위해 사용된다. 이는 시스템의 안정성을 보장하고, 잠재적인 문제를 신속하게 해결할 수 있도록 한다.

      • 일반적으로 NMI는 프로그래머가 직접적으로 트리거할 수 없으며, 하드웨어나 시스템의 상태에 의해 자동으로 발생한다.

7. timer interrupt는 누가 발생시키는가?

하드웨어 타이머에 의해 발생시킨다.

컴퓨터 시스템은 보통 하드웨어적으로 타이머를 가지고 있으며, 이 타이머는 시스템 클록이나 외부 클록 신호를 기반으로 정밀한 시간을 계산하는 데 사용된다. 타이머는 프로그램 가능한 인터럽트 컨트롤러 (PIC)나 타이머 칩과 같은 장치에 의해 관리되며, 설정된 시간 간격이 지나면 타이머 인터럽트가 발생한다.

8. EFLAGS register는 무엇인가?

EFLAGS 레지스터는 x86 아키텍처에서 사용되는 특별한 레지스터로, 다양한 프로세서 상태를 나타내는 플래그들을 포함한다. 이 플래그들은 프로세서의 동작을 제어하고 상태를 나타내며, 조건부 명령어 실행과 같은 작업에서 사용된다.

EFLAGS 레지스터에는 다양한 플래그들이 있다. 예를 들어, Carry Flag(CF), Zero Flag(ZF), Sign Flag(SF), Overflow Flag(OF) 등이 있으며, 각각은 서로 다른 프로세서 상태를 나타낸다.

  • Carry Flag (CF): 연산 결과에서 발생한 캐리를 나타낸다. 주로 부호 없는 산술 연산에서 사용된다.

  • Zero Flag (ZF): 연산 결과가 0이면 설정된다.

  • Sign Flag (SF): 연산 결과의 부호를 나타낸다.

  • Overflow Flag (OF): 부호 있는 정수 연산에서 발생한 오버플로우를 나타낸다.

    • Option: 만화나 소설에 나오는 "플래그 세우지 마라"는 대사의 그 flag인가?
      • 플래그는 프로그래밍에서 특정 조건을 만족했을 때, 해당 동작을 수행하도록 하는 변수를 의미한다. 이러한 개념이 점차 확장되어, 영화나 드라마, 애니메이션 등에서도 특정 상황을 나타내는 용어로 사용되게 되었다.
    • Option: 왜 다른 64bit register처럼 r로 시작하지 않고 e로 시작하는가?
      • EFLAGS와 같이 e로 시작하는 레지스터는 x86 아키텍처의 32비트 레지스터이다. r로 시작하는 레지스터들은 64비트 레지스터를 나타낸다. 하지만 현대의 x86 아키텍처에서는 64비트 레지스터를 사용하는 것이 일반적이며, 이에 따라 EFLAGS 대신 RFLAGS가 사용된다. 따라서 64비트 모드에서는 RFLAGS를 사용하고, 32비트 모드에서는 EFLAGS를 사용한다.

WIL 발표 자료

회고

c언어를 하면서도 열심히 포스팅 올리면서 정리했다고 생각했는데 이번주는 역대급으로 열심히 포스팅 했던 것 같다. 그만큼 공부한것도 많았고?... 팀원분께서 핀토스 했다고 말하는게 다가 아니라 핀토스를 뜯어보면서 다 이해했다고 말해야하지 않겠냐는 말씀에 더 열심히 했다... 프젝2는 진짜 프젝1보다 몇배는 더 힘들다. 누가 떠 먹여서 공부 좀 시켜줬음 좋겠을 지경이다... ㅠㅠ
너무너무 힘들다 ... 태훈님은 자꾸 와플대학만 먹자하고... 늦게오고... 일찍일찍 옵시다.

profile
Sunny Day!

0개의 댓글