본문 바로가기

CS(ComputerScience)/Pintos

Pintos Project2. User Program

728x90

Pintos Project2. User Program


System Call Flow in Virtual Space

 

가상공간인 User mode와 Kernel mode를 왔다 갔다하면서 시스템 콜이 진행되는 전반적인 과정을 정리해 봤다.

 

1page [출처 : 정글 pintos-project2 4조]

운영 체제는 새 프로세스가 생성되거나 기존 프로세스가 메모리에 로드될 때 그림과 같이 가상 메모리 시스템이 설정됩니다. 사용자 모드에서 시스템 콜이 발생하면,  커널 모드로 전환해 프로그램이 요청한 특정 서비스(즉, 시스템 콜 함수)를 호출합니다. 커널은 요청된 서비스를 처리하고 호출 처리가 완료되면, 다시 사용자모드로 전환해 처리 결과를 반환합니다.

 

User mode --- %rax(System call number) ---> Kernel mode
User mode <--- %rax( function return ) --- Kernel mode

 

 

저희가 구현한 pintos의 경우 부팅 후, disk에 file 적재합니다.
disk에 있는 file을 읽어서 가상 공간에 파일 메모리를 적재한 뒤, 실행 시키는 흐름으로 진행됩니다.
그럼 이 과정을 더욱 자세히 살펴보겠습니다. 


 

2page [출처 : 정글 pintos-project2 4조]

사용자 프로그램에서 시스템 호출을 수행하기 전, 시스템 호출 번호와 함께 필요 인자들을 미리 유저스택에 특정형식(argument passing)에 맞게 적재합니다.

 

📌 BSS 와 Initialized data segment 차이

BSS(Block Started by Symbol) : uninitialized, could be global variant
initial data segment : global variant

 


3page [출처 : 정글 pintos-project2 4조]

그리고 시스템호출을 통해 커널 모드로 전환됩니다.  커널은 시스템 호출 번호를 확인하고 해당 호출 번호에 대응하는 시스템 호출 함수를 수행합니다.  즉, 유저 스택에서 복사한 인자들을 검증하고 필요한 처리를 수행합니다.

커널모드에서는 운영체제에 필요한 stack pointer, program counter, register 값, 스케쥴링 관련 데이터 등의 정보를 캡슐화해 프로세스 제어 블록(PCB)에 저장해 둡니다.
저희가 구현 pinstos에서는 thread_launch함수가 쓰레드 구조체(struct thread)에 rax레지스터를 8바이트씩 이동하면서 데이터를 백업해둡니다.  

작업이 완료되면, 커널 모드에서 인터럽트를 발생시켜 CPU에게 함수 호출 처리가 완료되었음을 알립니다. 


 

4page [출처 : 정글 pintos-project2 4조]

인터럽트 핸들러가 실행되면, 현재 실행 중인던 context 값을 cpu가 intr_frame에서 가져옵니다. user stack에 푸시해줍니다.

커널단에서 시스템콜 함수를 처리하면서, elf파일의 헤더 정보를 활용해 메모리에 파일을 로드해 프로그램 실행을 준비했습니다. pintos 과제에서는 load()함수를 통해 이 과정이 수행되었습니다.

 

🔎 ELF header에는 어떤 정보가 있을까?

... 추후 정리예정...


 

5page [출처 : 정글 pintos-project2 4조]

유저모드에서는 이 파일에 접근하기 위해 MMU의 페이지 테이블를 사용합니다. 
cpu는 논리주소만 읽을 수 있기 때문에 MMU는 논리주소를 물리주소로 변환해 유저 프로세스가 로드된 파일에 접근할 수 있도록 돕습니다.
사용자 모드에서 MMU를 통해 실행파일에 접근한뒤, 프로그램이 실행됩니다.


🔎 virtual 공간을 나눠서 설계한 이유가 있을까?

User Space&nbsp;[출처 : 정글 pintos-project2 4조]

Process Isolation을 위해!

개별 프로세스를 분리하고 보호해 보안, 안정성, 리소스 관리, 오류 격리 등 여러 이점이 있습니다. 여러 프로세를 동시에 실행할 수 있고 시스템의 전반적인 안정성과 보안을 강화시킬 수 있습니다.

 

Kernel Space&nbsp;[출처 : 정글 pintos-project2 4조]

정보의 무결성과 보안을 보장하기 위해서 커널 공간에서만 PCB에 엑세스 할 수 있도록 설계했습니다.

또한 운영체제가 사용자 프로그램의 간섭 없이 인터럽트 및 예외를 원할하게 처리할 수 있어 안전한 환경에서 필요한 interrupt context를 쉽게 사용할 수 있도록 보장해줍니다.