프로세스 개요
xv6에서 격리의 단위는 프로세스입니다.
프로세스 추상화는 한 프로세스가 다른 프로세스의 메모리, CPU, 파일 디스크립터 등을 파괴하거나 감시하지 못하도록 합니다. 또한, 프로세스가 커널 자체를 파괴하는 것을 방지하여 프로세스가 커널의 격리 메커니즘을 교란할 수 없도록 합니다. 커널이 프로세스를 구현하는 데 사용하는 메커니즘에는 사용자/커널 모드 플래그, 주소 공간, 스레드의 시간 조각화 등이 있습니다.
프로세스 추상화는 프로그램에게 개인용 컴퓨터를 가지고 있는 것처럼 보이도록 도와 격리를 강화합니다.
프로세스는 다른 프로세스가 읽거나 쓸 수 없는 것으로 보이는 개인 메모리 시스템 또는 주소 공간을 프로그램에 제공합니다. 또한, 프로세스는 프로그램의 명령을 실행하는 데 자체 CPU를 제공하는 것처럼 보입니다.
xv6 각 프로세스에 고유한 주소 공간을 제공하기 위해 하드웨어에 의해 구현된 페이지 테이블을 사용합니다.
RISC-V 페이지 테이블은 가상 주소를 물리적 주소로 변환합니다.
xv6는 각 프로세스에 대해 별도의 페이지 테이블을 유지하여 해당 프로세스의 주소 공간을 정의합니다.
주소 공간에는 가상 주소 0에서 시작하는 프로세스의 사용자 메모리가 포함됩니다. 명령이 먼저 오고, 전역 변수가 이어지며, 스택이 그 다음에 오고, 마지막으로 프로세스가 필요에 따라 확장할 수 있는 힙 영역이 있습니다.
RISC-V의 포인터는 64비트 너비입니다. 하드웨어 페이지 테이블에서 가상 주소를 찾을 때 낮은 39비트만을 사용합니다. xv6는 이 39비트 중 38비트만을 사용하기에 최대 주소는 2^38-1 = 0x3fffffffff이며, 이는 MAXVA(kernel/riscv.h:348)입니다.
주소 공간의 맨 위에 xv6는 커널로 전환하기 위한 트램폴린과 프로세스의 트랩 프레임을 매핑하는 페이지를 예약합니다.
xv6 커널은 각 프로세스마다 많은 상태 정보를 유지합니다. 이 정보는 struct proc에 모아지며, 프로세스의 가장 중요한 커널 상태는 페이지 테이블, 커널 스택 및 실행 상태입니다.
각 프로세스에는 명령을 실행하는 실행 스레드가 있습니다. 프로세스 간에 투명하게 전환하기 위해 커널은 현재 실행 중인 스레드를 중단하고 다른 프로세스의 스레드를 재개합니다. 스레드의 많은 상태 정보는 스레드의 스택에 저장됩니다.
각 프로세스에는 사용자 스택과 커널 스택 두 개의 스택이 있습니다.
프로세스가 사용자 명령을 실행하는 동안에는 사용자 스택만 사용되고, 커널 스택은 비어 있습니다.
프로세스가 커널에 진입할 때, 커널 코드가 프로세스의 커널 스택에서 실행됩니다.
커널 스택은 사용자 코드로부터 분리되어 있고 보호되어 있으므로, 프로세스가 사용자 스택을 손상시켜도 커널이 실행될 수 있습니다.
프로세스는 RISC-V ecall 명령을 실행함으로써 시스템 호출을 수행할 수 있습니다.
이 명령은 하드웨어 권한 수준을 높이고 프로그램 카운터를 커널이 정의한 진입점으로 변경합니다.
시스템 호출이 완료되면 커널은 사용자 스택으로 다시 전환하고 sret 명령을 호출하여 하드웨어 권한 수준을 낮추고 시스템 호출 명령 바로 다음에 사용자 명령을 계속 실행합니다. 프로세스의 스레드는 I/O를 기다리기 위해 블록될 수 있으며, I/O가 완료되면 이전 위치에서 계속 진행됩니다.
sret (스프리브 이터럽트 리턴 - RISC-V 아키텍처)
시스템 호출이나 예외 처리 후에 커널 모드에서 사용자 모드로 돌아갈 때 사용됩니다.
이 명령은 하드웨어 권한 수준을 낮추고, 다음 사용자 프로그램 명령을 실행할 준비가 된 프로그램 카운터를 지정합니다.
p->state는 프로세스가 할당되었는지, 실행 준비가 되었는지, 실행 중인지 , I/O를 기다리고 있는지 또는 종료 중인지를 나타냅니다. p->pagetable은 프로세스의 페이지 테이블을 저장하는 변수입니다. 이 페이지 테이블을 RISC-V 하드웨어가 기대하는 형식으로 저장됩니다. 페이지 테이블은 가상 주소와 물리 주소 간의 매핑을 정의하며, 프로세스의 메모리 엑세스를 관리하는 데 사용됩니다.
'xv6-book' 카테고리의 다른 글
xv6-book (Ch2.6-Real world) (0) | 2024.04.30 |
---|---|
xv6-book (Ch2.6-Code: starting xv6 and first process) (0) | 2024.04.30 |
xv6-book (Ch2.4-xv6 organization) (0) | 2024.04.30 |
xv6-book (Ch2.3-Kernel organization) (0) | 2024.04.30 |
xv6-book (Ch2.2-User mode, supervisor mode, and system calls) (0) | 2024.04.30 |