Always Be Wise

Project_2 : User Programs - Weekly I Learned 본문

카이스트 정글 - 프로젝트/Pintos

Project_2 : User Programs - Weekly I Learned

bewisesh91 2022. 1. 10. 21:07
728x90

이번 프로젝트를 통해 주요하게 학습한 내용은 시스템 콜(System Call)과 관련한 것이었다.

시스템 콜이란 프로세스가 운영체제(커널)에게 어떤 기능(서비스)을 사용하게 해달라고 요청하는 것을 의미한다.

 

시스템 콜을 이해하기 위해서는 모드 비트(Mode Bit)라는 하드웨어를 알고 있어야 한다.

모드 비트는 사용자 모드(User Mode)와 커널 모드(Kernel Mode), 두 가지 실행 모드를 제공하는 하드웨어이다.

 

사용자 모드에서 실행되는 프로세스는 할 수 있는 일이 제한된다.

반면, 커널 모드에서는 모든 특수한 명령어를 포함하여 사용자 모드에서 할 수 없었던 작업을 수행할 수 있다.

 

예를 들어, 파일을 읽고 쓰는 것과 같은 수행은프로세스가사용자 모드에서 자유롭게 진행할 수 없다.

하지만 사용자 모드에서 커널 모드로 전환되어 특권 수준이 상향된다면 그것이 가능하다.

이러한 사용자 모드에서 커널 모드로의 전환을 가능케 하는 것이 시스템 콜이다.

 

시스템 콜 호출 시 흥미로운 점은 이를 호출한 프로세스의 레지스터 정보들이 커널 스택에 저장된다는 것이다.

이는 CPU가 자동으로 수행하는 과정으로, 시스템 콜 처리 작업 후 해당 프로세스로 제대로 리턴하기 위함이다.

 

때때로 시스템 콜 실행 중에  현재 프로세스에서 다른 프로세스로 CPU 제어를 전환해야 하는 경우가 발생한다.

이를 문맥 전환(Context Switching)이라 한다.

 

문맥 전환은 앞서 언급한 작업에 더불어 추가적인 작업을 필요로 한다.

우선, 커널스택에 저장되어 있는 시스템 콜 호출 프로세스의 레지스터 정보들을 해당 프로세스 구조체에 저장한다.

이 프로세스 구조체 역시 커널 스택에 존재한다. 이후, 전환하고자 하는 프로세스의 구조체에서 레지스터 정보를 복원한다.

해당 과정을 통해 실행이 중단된 프로세스의 문맥을 저장하고, 새로이 실행될 프로세스의 문맥을 복원한 것이라 할 수 있다.

 

아래는 운영체제 : 아주 쉬운 세가지 이야기에서 발췌한 문맥 전환 코드이다. 어셈블리 코드를 이용하여 작성된 것을 알 수 있다.

어셈블리 코드로 작성된 이유는 실행 속도 때문이다. Pintos에서도 문맥 전환과 관련한 작업들이 어셈블리 코드로 이루어져 있다.

이번 프로젝트가 어렵다고 느껴졌던 이유 역시 익숙하지 않았던 어셈블리 코드 때문이었다.

 

 

더불어 문맥 전환 시 프로세스의 문맥이라는 것이 어떤 저장 장치와 자료구조에서 저장, 복원되는지가 명확하지 않아 어려움이 있었다.

그러나 아래의 내용들을 공부하고 Pintos 환경과 코드를 비교, 확인하면서 이해를 넓혀 갈 수 있었다. 

범용 레지스터(eax, ebx, ecx, edx, esi, edi, esp, ebp, eip - 32 bit 환경 기반)
레지스터란 CPU 내부에서 사용하는 작은 크기의 고속 기억 장치를 의미한다. 

1. eax(extended accumulator register)

산술, 논리 연산을 수행할 때 사용되며, 함수의 리턴 값을 저장한다.

2. ebx(extended base register)
메모리 주소를 저장하기 위한 용도로 사용된다.


3. ecx(extended counter register)
반복 명령어 사용 시 카운터로 사용된다. 

4. edx(extended data register)
산술, 논리 연산을 수행할 때 사용되며, 부호 확장 등 eax의 보조 역할을 담당한다.

5. esi(extended source index)
데이터를 복사 / 비교할 때 소스의 데이터 주소가 저장된다.

6. edi(extended destination index)
데이터를 복사 / 비교할 때 목적지의 주소가 저장된다.

7. esp(extended stack pointer)
스택 프레임의 가장 최근 주소를 저장한다. push나 pop 등의 명령어로 값이 변한다.

8. ebp(extended base pointer)
스택 프레임의 시작 주소를 저장한다. 

9. eip(extended instruction pointer)
다음 명령어가 저장된 메모리의 주소를 저장한다.

Pintos Intr_frame 구조체(왼쪽), xv6 Proc 구조체(오른쪽)

 

시스템 콜을 공부하면서 운영체제가 어떻게 하드웨어와 함께 동작하는지, 프로세스와 문맥전환이 무엇인지 보다 명확히 알게 되었다.

또한, 이후 프로젝트에서 공부하게 될 가상 메모리, 파일 시스템과 관련한 내용 역시 조금은 맛볼 수 있었다.

이번 프로젝트를 진행하면서 정리한 내용들은 아래 링크에 담아보았다.

 

2021.12.30 - [프로젝트/Pintos] - Project_2 : User Programs - Introduction

2021.12.30 - [프로젝트/Pintos] - Project_2 : User Programs - Argument Passing

2022.01.04 - [프로젝트/Pintos] - Project_2 : User Programs - System Calls(1)

2022.01.07 - [프로젝트/Pintos] - Project_2 : User Programs - System Calls(2)

 

Comments