[PINTOS] Project2: USER PROGRAMS

김승환·2022년 1월 11일
0

SW정글

목록 보기
2/4

Pintos project2를 통해 사용자 모드(user mode)와 커널 모드(kernel mode)가 무엇인지를 배우고, 서로 상호작용할 수 있게 해주는 system call이 무엇인지를 직접 구현해보면서 이해해보았다.

1. 커널 모드(Kernel mode)와 사용자 모드(User mode)

운영체제에는 두 개의 동작 모드, 커널 모드와 사용자 모드가 있다. 하드웨어에서는 모드 비트(mode bit)를 이용해 커널 모드(0)와 사용자 모드(1)을 구분한다. 이 두 동작 모드가 생기게 된 이유는 여러 프로그램이 동시에 구동하며 메모리에 함께 존재하면서 생기는 문제를 방지하거나 악의적인(..?) 사용자가 시스템에 영향을 끼치는 것을 방지하기 위해서 이다. 이를 방지하기 위해 운영 체제는 모든 동작이 가능한 모드와 동작이 제한된 모드를 나뉘게 된다.

커널 모드

특권을 가지게 된 모드, 즉 커널 모드(그래서 커널 모드를 다른 말로 supervisor mode 혹은 privileged mode라고도 한다)는 모든 자원(드라이버, 메모리, CPU 등)에 접근이 가능하고, 명령을 내릴 수 있다. 예를 들어, I/O 명령을 내리거나 정보들을 받아 올 수 있다.

사용자 모드

사용자 모드는 반대로 사용자가 접근할 수 있는 영역을 제한하고 프로그램의 자원에 쉽게 접근 및 명령이 불가능한 모드이다. 이 모드에서는 유저 어플리케이션 코드 정도가 실행된다.

2. 시스템 콜(System call)

시스템 콜이란 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 프로세스가 진행되는 동안 프로세스는 커널 모드와 사용자 모드를 이동하며 일을 진행한다. 프로세스가 유저모드에서 실행 되다가 I/O 같은 자신이 권리를 부여받지 못한 일을 처리할 필요가 있을 경우 시스템 콜을 통해 커널에 필요한 일을 처리해 줄 것을 요청한다. 커널 모드에서는 요청 받은 일을 해결하고 그 결과 값을 시스템 콜의 리턴 값으로 전해준다. 이때 운영체제에서 필요한 정보를 전달하기 위한 방법으로는 3가지가 있다.

  • 매개변수를 CPU 레지스터 내에 전달한다. 이 경우에 매개변수의 갯수가 CPU 내의 총 레지스터 개수보다 많을 수 있다.
  • 위와 같은 경우에 매개변수를 메모리에 저장하고 메모리의 주소가 레지스터에 전달된다.
  • 매개변수는 프로그램에 의해 스택으로 전달 될 수 있다.

핀토스 프로젝트에서는 X86-64 CPU를 사용하는 운영체제이고, 64bit 값을 저장할 수 있는 16개의 범용 정수 레지스터를 보유하고 있다. 이때, %rax에는 enum으로 지정된 시스템 콜 정보가 담기고, %rdi, %rsi, %rdx, %r10, %r8, %r9 순으로 argument가 담겨 syscall_handler로 넘어간다. 이와 같은 정보는 lib/user/syscall.c에서 확인 할 수 있다.

3. 시스템 콜 함수

추후 작성 예정

참고문헌

profile
팀스파르타에서 IT 직군 채용 플랫폼 '인텔리픽'을 개발하고 있습니다.

0개의 댓글