6/11 System call의 흐름

JK·2023년 6월 11일

System call의 흐름

시스템 호출(System Call)은 사용자 프로그램이 커널의 기능을 요청하는 인터페이스입니다. 시스템 호출은 사용자 모드에서 호출되며, 커널 모드로 전환하여 커널 내부의 기능을 실행하고, 그 결과를 사용자 프로그램에 반환합니다. 아래는 Pintos에서 시스템 호출이 처리되는 과정을 자세하게 설명한 것입니다:

  1. 사용자 프로그램에서 시스템 호출 함수 호출: 사용자 프로그램은 시스템 호출을 수행하기 위해 해당 기능에 해당하는 시스템 호출 함수를 호출합니다. 이 호출은 C 또는 어셈블리 언어로 작성된 시스템 호출 인터페이스를 통해 수행됩니다. 예를 들어, open 시스템 호출을 수행하기 위해 open() 함수를 호출할 수 있습니다.

  2. 사용자 모드에서 커널 진입: 시스템 호출 함수 호출 시, 사용자 프로그램은 사용자 모드에서 커널 모드로 전환됩니다. 이는 특권 명령(instruction)을 사용하여 보호된 커널 영역으로 진입하는 것을 의미합니다.

  3. 인터럽트 및 컨텍스트 스위칭: 사용자 모드에서 커널 모드로 전환되면, 해당 시스템 호출이 인터럽트나 예외로서 커널에 알려지게 됩니다. 예를 들어, x86 아키텍처에서는 소프트웨어 인터럽트나 트랩 인터럽트를 사용하여 커널에 진입합니다. 컨텍스트 스위칭이 발생하여 현재 실행 중인 사용자 모드 스레드의 상태가 저장되고, 커널 모드의 실행을 위한 스레드 상태로 전환됩니다.

  4. 시스템 호출 핸들러 실행: 커널 모드에서, 시스템 호출 핸들러가 호출됩니다. 시스템 호출 핸들러는 커널 내부에서 시스템 호출 기능을 처리하는 함수입니다. 핸들러는 요청된 시스템 호출 기능에 따라 해당 작업을 수행하게 됩니다. 예를 들어, open 시스템 호출 핸들러는 파일을 열고 파일 디스크립터를 할당하는 작업을 수행합니다.

  5. 시스템 호출 처리: 시스템 호출 핸들러는 시스템 호출의 요구에 따라 필요한 작업을 수행합니다. 이 작업은 커널의 다른 부분과 상호작용하여 파일 시스템, 메모리 관리, 프로세스 관리 등과 같은 커널의 기능을 수행합니다. 예를 들어, open 시스템 호출 핸들러는 주어진 파일을 열기 위해 파일 시스템에 접근하고, 해당 파일에 대한 파일 디스크립터를 할당하여 프로세스의 파일 디스크립터 테이블에 추가합니다.

  6. 결과 반환 및 컨텍스트 복원: 시스템 호출 핸들러는 요청된 작업을 완료하고, 사용자 프로그램에 필요한 결과를 반환합니다. 이후, 컨텍스트 스위칭이 발생하여 커널 모드의 실행 상태가 저장되고, 사용자 모드의 실행 상태로 복원됩니다.

  7. 사용자 모드 복귀: 시스템 호출이 완료되면, 사용자 프로그램은 다시 사용자 모드로 복귀하게 됩니다. 시스템 호출 함수 호출 이후의 코드 실행이 계속됩니다. 결과에 따라 사용자 프로그램은 시스템 호출이 성공했는지 여부를 확인하고, 결과에 따른 후속 작업을 수행할 수 있습니다.

위의 과정은 Pintos 시스템 호출이 처리되는 전반적인 흐름을 설명한 것입니다. 실제로 Pintos의 내부 동작은 시스템 호출의 종류, 커널의 구조, 아키텍처에 따라 상세한 구현이 달라질 수 있습니다. 따라서, 시스템 호출의 세부 동작에 대해서는 Pintos의 소스 코드와 해당 아키텍처에 대한 자세한 이해가 필요합니다.


내가 생각한 중요한 부분

  1. 컨텍스트 스위칭: 사용자 모드에서 커널 모드로의 전환과 커널 모드에서 사용자 모드로의 복귀는 컨텍스트 스위칭을 통해 이루어집니다. 컨텍스트 스위칭은 현재 실행 중인 프로세스의 상태를 저장하고, 시스템 호출 핸들러의 실행을 위해 적절한 커널 모드의 스레드 상태로 전환하는 과정입니다.

  2. 시스템 호출 핸들러: 시스템 호출 핸들러는 커널 내부에서 시스템 호출 기능을 처리하는 함수입니다. 각 시스템 호출에는 해당하는 핸들러가 있으며, 이 핸들러는 요청된 작업을 수행하고 결과를 반환합니다. 시스템 호출 핸들러는 커널의 다른 부분과 상호작용하여 필요한 작업을 수행합니다.

  3. 사용자 프로그램과 커널 간의 인터페이스: 사용자 프로그램은 시스템 호출 함수를 사용하여 커널의 기능을 요청합니다. 이 함수들은 사용자 모드에서 호출되며, 시스템 호출 인터페이스를 통해 커널로 진입합니다. 사용자 프로그램은 시스템 호출 함수를 올바르게 사용하고, 요청된 기능에 대한 적절한 인자를 전달해야 합니다.

  4. 결과 반환: 시스템 호출 핸들러는 요청된 작업을 완료한 후, 사용자 프로그램에 필요한 결과를 반환합니다. 이 결과는 시스템 호출 함수를 호출한 사용자 프로그램에서 확인하고, 이에 따라 후속 작업을 수행할 수 있습니다. 예를 들어, 파일을 열기 위한 open 시스템 호출은 파일 디스크립터를 반환하여 사용자 프로그램에서 파일을 조작할 수 있도록 합니다.

이러한 부분들을 중요하게 봐야하며, 시스템 호출의 구체적인 구현과 세부 동작은 Pintos 소스 코드와 해당 아키텍처에 따라 달라질 수 있습니다.


공부하고 작성한 코드를 하나씩 올리면 너무 오랜 시간이 필요할 거 같아서 코드는 github에 올렸으니 필요하신 분들은 확인해 주세요ㅎㅎ
github 주소


오늘까지가 system call에 관해 공부하는 마지막 날 입니다
이번 주는 개인적으로 아쉬움이 많이 남는 것 같습니다. 여러 가지 시행착오 때문에 공부에 집중한 시간도 다른 때 보다 적었던 거 같고 처음의 계획했던 목표를 다 이루지도 못했던 점이 많이 아쉬운 거 같습니다
내일부터는 가상 메모리에 관한 공부를 시작하게 되는데 이번 주에 겪었던 시행착오들을 고쳐서 더 효율적으로 공부할 수 있었으면 좋겠습니다

profile
^^

0개의 댓글