본문 바로가기
3-2 학기/Operating Systems

[운영체제] xv6 구조 및 동작 원리

by bona.com 2024. 10. 29.

운영체제 설계 과제를 구현하던 중, xv6 구조 및 동작 원리에 대해 자세하게 공부해보고 싶어 글을 남긴다.

먼저 기본 개념 먼저 집고 가자.

 

xv6

xv6는 멀티프로세서 x86 및 RISC-V 시스템을 위해 개발한 교육용 운영체제이다.

xv6를 가상 환경에서 실행 시키기 위해서는 리눅스에서 사용하는 가상머신인 QEMU를 사용하면 된다.

- QEMU를 시작하는 명령어는 make qemu이며, 

- QEMU를 종료하는 단축키는 (맥북에서) control + A, X 이다.

 

xv6 레포지토리를 복제할 수 있는 깃허브 주소는 아래와 같다.

https://github.com/mit-pdos/xv6-public

 

GitHub - mit-pdos/xv6-public: xv6 OS

xv6 OS. Contribute to mit-pdos/xv6-public development by creating an account on GitHub.

github.com

 

 

스케줄링

- 스케줄링은 다중 프로그래밍을 가능하게 하는 운영체제 커널의 기본 기능이다.

- 기존 xv6의 스케줄링 기법은 다음 실행할 프로세스를 process table을 순회하며 RUNNABLE 상태인 프로세스를 순차적으로 선택한다.

 

동작 원리 

xv6를 실행하면 프로세스를 생성하기에 앞서, 부팅 과정이 먼저 수행된다.

- bootas.Sbootmain.c가 부팅 과정을 담당한다.

- 부트로더는 하드웨어를 초기화하고 xv6 커널을 메모리에 로드한 뒤 실행한다.

 

그 다음, 커널 초기화 단계가 수행된다.

- main.c의 main() 함수가 커널 초기화의 시작점이다.

main.c의 구성은 위와 같다.

주석에서도 알 수 있듯이, user process는 userinit() 함수로 생성이 되고, mpmain() 함수로 실행이 된다.

mpmain() 함수에서 scheduler() 함수를 호출하는데, 이때 호출된 scheduler가 앞서 생성한 프로세스를 실행시킴으로써 첫 번째 프로세스가 생성된다.

 

프로세스 관리

xv6는 proc 구조체로 표현되며, ptable이라는 프로세스 테이블에 저장된다.

이 구조체는 pid, state, 메모리 정보, 스케줄링 정보를 포함한다.

proc.c에서 주요 함수들을 다루고 있는데, 설명하면 다음과 같다.

- fork(): 새로운 프로세스 생성

- exit(): 기존 프로세스 종료

- scheduler(): 프로세스 스케줄링

(프로세스를 RUNNING, RUNNABLE, SLEEPING등의 상태로 전환한다.)

 

파일 시스템

xv6의 파일 시스템은 Unix의 파일 시스템을 단순화한 구조이다.

각 파일은 i-node라는 구조체로 관리된다.

i-node는 파일의 메타데이터를 저장한다.

 

인터럽트 

xv6는 하드웨어 이벤트 처리를 위해 인터럽트를 사용한다.

trap.c에서 인터럽트를 처리하며, 프로세스 스케줄링 등에 활용된다.


결과

마지막으로 실제 QEMU를 시작했을 때 뜨는 사진을 통해 확인해보자.

 

부팅 과정 -> 커널 시작 -> 프로세스 생성 -> 스케줄링

과정을 거치는 것을 확인할 수 있을 것이다.