WIL/스터디

Pintos Extra Questions

아크리미츠 2024. 8. 22. 18:34

1. %rip, %rsp 레지스터의 의미와 CPU 동작에서의 역할

  • %rip (Instruction Pointer Register): %rip는 현재 실행 중인 명령어의 메모리 주소를 가리키는 레지스터입니다. 프로세서가 명령어를 실행할 때마다 %rip는 다음에 실행할 명령어의 주소로 업데이트됩니다. 명령어 실행이 완료되면 %rip는 자동으로 다음 명령어의 주소로 증가하거나, 점프(분기) 명령에 따라 특정 주소로 설정됩니다.
  • %rsp (Stack Pointer Register): %rsp는 현재 스택의 최상단을 가리키는 레지스터입니다. 함수 호출 시, 함수의 리턴 주소나 지역 변수를 저장하기 위해 스택을 사용하게 되며, 이때 %rsp는 스택의 최상단을 관리합니다. PUSH 및 POP 명령어는 %rsp를 조작하여 데이터를 스택에 삽입하거나 제거합니다.

2. JMP와 CALL의 차이점

  • JMP: JMP는 무조건적인 분기 명령어로, 현재 명령어의 흐름을 특정 주소로 즉시 이동시킵니다. 이때 현재 명령어의 리턴 주소는 저장되지 않습니다.
  • CALL: CALL은 서브루틴(함수)을 호출하는 명령어입니다. CALL은 먼저 현재 %rip 값을 스택에 저장한 후, 호출하려는 함수의 주소로 분기합니다. 함수가 종료될 때 RET 명령어를 통해 스택에 저장된 리턴 주소로 복귀합니다.

3. JMP, CALL, RET, PUSH, POP, IRET 명령에서 %rip, %rsp 값의 변화

  • JMP:
    • %rip: 지정된 주소로 변경
    • %rsp: 변화 없음
  • CALL:
    • %rip: 함수의 시작 주소로 변경
    • %rsp: 이전 %rip 값을 스택에 저장하면서 감소
  • RET:
    • %rip: 스택에서 리턴 주소를 POP하여 설정
    • %rsp: 리턴 주소를 POP하면서 증가
  • PUSH:
    • %rsp: 감소 (스택에 데이터를 저장)
    • 스택에 저장된 데이터는 %rsp가 가리키는 주소에 저장됨
  • POP:
    • %rsp: 증가 (스택에서 데이터를 제거)
    • POP된 데이터는 %rsp가 가리키는 주소로부터 가져옴
  • IRET (Interrupt Return):
    • %rip: 스택에 저장된 리턴 주소로 복귀
    • %rsp: POP된 값에 따라 증가
    • 인터럽트 발생 시 저장된 플래그와 %rip 값을 복원합니다.

4. 인터럽트 발생 시 CPU는 어떻게 동작하는가? 레지스터 값 및 연관된 메모리는?

인터럽트가 발생하면 CPU는 다음 단계를 거칩니다:

  1. 현재 명령어 중단: 현재 실행 중인 명령어가 완료되지 않은 경우 일시 중단됩니다.
  2. EFLAGS 레지스터 저장: 현재 상태를 나타내는 EFLAGS 레지스터 값이 스택에 저장됩니다.
  3. %rip 저장: 현재 명령어의 다음 주소인 %rip 값이 스택에 저장됩니다.
  4. 인터럽트 핸들러 실행: 인터럽트 벡터에 따라 지정된 인터럽트 핸들러 코드가 실행됩니다.
  5. %rip, %rsp 변화: %rip는 인터럽트 핸들러의 시작 주소로 변경되고, %rsp는 스택에 저장된 값을 처리하면서 감소합니다.

5. 인터럽트를 처리한 후에는 어떻게 되는가?

인터럽트 처리가 완료되면 IRET 명령어를 통해 CPU는 다음 단계를 수행합니다:

  1. %rip 복원: 스택에서 저장된 %rip 값을 POP하여 원래 실행되던 위치로 복귀합니다.
  2. EFLAGS 복원: 스택에 저장된 EFLAGS 값이 복원됩니다.
  3. 명령어 재개: 인터럽트가 발생하기 전의 명령어 흐름이 재개됩니다.

6. 인터럽트를 어떻게 enable/disable 시킬 수 있는가? enable/disable 되면 뭐가 달라지는가?

  • 인터럽트 비트 (IF) 제어: EFLAGS 레지스터의 인터럽트 플래그 (IF)를 제어하여 인터럽트를 활성화 (STI 명령어)하거나 비활성화 (CLI 명령어)할 수 있습니다.
  • 활성화: IF 비트를 설정하면 CPU가 외부 하드웨어 장치나 타이머로부터 오는 인터럽트를 처리할 수 있습니다.
  • 비활성화: IF 비트를 클리어하면 CPU는 외부 인터럽트를 무시하며, 오직 Non-Maskable Interrupt (NMI)와 같은 특정 인터럽트만 처리할 수 있습니다.

+ NMI (Non-Maskable Interrupt)는 무엇인가?

  • NMI: Non-Maskable Interrupt는 CPU에서 무시할 수 없는 고우선순위의 인터럽트입니다. 시스템의 치명적인 오류나 긴급한 상황에서 발생합니다. NMI는 IF 플래그에 의해 비활성화되지 않으며, 항상 처리됩니다. 일반적으로 하드웨어 오류(예: 메모리 파리티 에러)나 중요한 시스템 이벤트에 사용됩니다.

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

  • 타이머 인터럽트는 시스템의 하드웨어 타이머에 의해 발생됩니다. 주로 Programmable Interval Timer (PIT)나 고급 시스템에서는 APIC (Advanced Programmable Interrupt Controller) 타이머가 사용됩니다. 타이머 인터럽트는 주기적으로 발생하며, 운영체제가 시간 기반의 작업(예: 프로세스 스케줄링)을 처리할 수 있게 해줍니다.

7. EFLAGS 레지스터는 무엇인가?

  • EFLAGS: CPU의 상태를 나타내는 플래그들을 포함하는 레지스터입니다. 이 레지스터에는 연산 결과에 따른 조건 플래그(CF, ZF, SF 등), 인터럽트 플래그(IF), 방향 플래그(DF), 트랩 플래그(TF) 등이 포함되어 있습니다. 이 플래그들은 CPU가 명령어를 실행하는 동안 설정되고, 특정 조건에 따라 명령어의 흐름이나 CPU 동작을 제어합니다.

+ EFLAGS는 왜 다른 64bit register처럼 r로 시작하지 않고 e로 시작할까?

  • EFLAGS는 32비트 시절의 유산입니다. 32비트 레지스터들은 e로 시작하며, EFLAGS도 그 중 하나입니다. 64비트 확장판에서는 RFLAGS라는 이름으로 존재하지만, 대부분의 문서와 코드에서는 여전히 EFLAGS로 표기됩니다. 이는 기존의 32비트와의 호환성을 유지하기 위함입니다.

'WIL > 스터디' 카테고리의 다른 글

인터넷 지식  (1) 2024.08.27
Thread & Process  (0) 2024.08.25
Malloc Lab  (0) 2024.08.25
Virtual Memory  (0) 2024.08.23
Red-Black Tree Extra Questions  (0) 2024.08.21