<aside> ❗ 목차

  1. User mode vs Kernel mode

  2. Call Stack

  3. Fork

</aside>

  1. User mode vs Kernel mode

    Untitled

    흔히 커널모드(Kernel Mode)는 Privileged mode, 유저모드(User Mode)는 Unprivileged mode라고 한다. 커널모드는 모든 자원에 접근 할 수 있지만 유저모드에서는 자원 접근이 한정적이기 때문이다. 굳이 모드를 두 가지로 나누고 자원 접근을 막는 이유는 운영체제를 프로세스로 부터 보호하여 추상화를 하기 위함이다. 여러 프로세스가 모두 자원을 사용할 권한이 있다면 관리가 되지 않기 때문이다. 따라서 유저모드에서 자원을 할당받아야 하면 운영체제에 시스템 콜을 보내 커널모드에 진입하여 자원을 할당 받고 사용하며 사용을 마치면 권한을 반납한다. 이러한 모드 변경을 Context Switching 이라 한다. 시스템 콜에 대한 실행 코드는 운영체제가 미리 갖고 있다. 우리는 이번 프로젝트에서 시스템 콜에 대한 실행 코드를 직접 구현한다.

  2. Call Stack

    Untitled

    Call Stack이란 함수간의 관계를 Stack을 통해 나타내는 것이다.(정확한 정의인지는 의문이다.) 우선 위의 이미지에서 1,2,3,4의 순서대로 함수를 호출한다. procedure 1이 procedure 2를 호출하고 procedure 2가 procedure 3을 호출하는 방식이다. 스택 내부에는 지역변수, 함수에 필요한 매개변수, 그리고 해당 함수를 호출한 함수의 주소가 있다. 이러한 스택 단위를 Stack frame이라 한다. 이때 호출을 한 함수를 caller, 호출 당한 함수를 callee라 부른다. Stack Frame을 구성하는 요소는 같지만 구성하는 순서는 운영체제 및 아키텍쳐마다 다르다. 위 그림에서는 return address가 맨 위에 있지만 중간에 있는 경우도 있고 parameter를 쌓는 순서가 다를 때도 있다. 또한 함수 실행 종료 후 스택 프레임을 비우는 과정도 다를 수 있다. 이러한 규약을 Calling Convention이라 한다. 본 Pintos 에서는 X86 64bit Calling Convention을 따른다.

  3. Fork, Exec Call

    리눅스 운영체제에서는 파일의 실행은 fork와 exec의 시스템콜에 의해 이루어 진다. fork는 복제라 생각하면 편하다. 한 프로세스를 그대로 복제한다. 이때 fork를 호출한 프로세스를 부모 프로세스라 하며 fork에 의해 생성된 프로세스는 자식 프로세스라 한다. fork에 의해 생성된 자식프로세스의 Pid와 부모 프로세스의 Pid는 서로 다르다.

    반면 exec은 덮어 쓰기라 생각하면 편하다. 매개 변수와 exec 함수를 호출하면 부모 프로세스에 exec으로 실행하려는 프로세스가 덮어 씌어진다. 따라서 새로 생성된 함수와 부모 프로세스의 Pid는 동일하다.

    Untitled

    위 그림은 fork 시스템콜을 간단하게 구현한 것이다. 참고로 fork()를 호출하면 부모 프로세스는 자식프로세스의 Pid를 리턴받고 자식프로세스는 0을 리턴 받는다. fork()를 3번 호출하면 생성된 자식 프로세스들이 또 다른 자식을 생성하므로 8개의 프로세스가 실행되어 printf가 8번 실행된다. 자세히 보면 8개의 프로세스의 pid는 각각 다르다.

    Untitled

    위 그림은 exec 시스템 콜을 간단하게 구현한 것이다. ex1.c의 8번째 줄에서 ex2.c를 호출한다. 그러면 ex1의 프로세스에 ex2의 프로세스가 덮어 씌어진다. 그리고 ex1의 pid와 ex2의 pid가 상이한 것을 알 수 있다. ex1의 9번째 줄의 printf가 실행되지 않는데 이것은 ex2로 덮어 씌어졌기 때문이다. 만약 ex1으로 돌아가게 코드를 구현하면 printf가 실행될 것이다.

위 내용들은 아래 유튜브를 참고하였습니다.

fork() and exec() System Calls

The Call Stack

https://apption.co/embeds/54addc8d