목차
이번 주에는 무엇을 배웠나?
project 2 는 기본적으로 user program이 실행되며 커널과 상호작용을 할 수 있도록 하는 과정이었다.
이를 위해 system call과 같은 kernel이 user에게 제공하는 interface의 내부 기능들을 집중적으로 구현해야했다.
이 때 매개 변수 및 실행 하고자 하는 system call 함수명을 CPU 레지스터 내에 담아 전달한다.
전 주 차의 thread scheduler 및 alarm clock 등의 구현에서도 수 많은 코드와의 상호작용이 필요했지만, 이번 주차에서 syscall을 다루면서 더욱 상호작용하는 코드들이 많아졌다.
pintOS 프로젝트에서 요구된 syscall의 두 큰 대분류는 process control 과 file management였다.
process control 영역에 해당하는 syscall 들은 process.c 에 있는 process 조작 함수들과 깊은 상호작용이 필요했고, file management는 filesys.c 에 있는 file system 함수들과 깊은 상호 작용이 필요했다.
여기서 배울 수 있던 점은 여러 syscall 들이 fie system의 지원이 필요하다는 점이었다.
또한 User 레벨을 다루게 되면서 kernel 레벨 과 user 레벨 사이에서 userprogram을 실행 시키기 위한 process가 성공적으로 execute 된 후, idle thread 그리고 kernel thread와 user program을 실행 시키고 있는 user thread의 명확한 차이는 당연할 것이다.
📖system call이란?
운영체제는 커널 모드, 유저 모드로 나뉘어 구동된다. 이때 프로그램 (user program)은 유저 모드 레벨에서 구동되는데, 파일을 읽거나, 쓰거나, 화면에 메세지를 출력하는 등의 커널 모드에서 구동되는 기능들을 호출하기위해 system call이라는 interface를 운영체제는 제공한다.
그림.open() 시스템 콜을 호출한 사용자 응용의 처리
필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때 좀 더 많은 정보가 필요할 수 있다. 그러한 정보가 담긴 매개변수를 운영체제에 전달하기 위해서는 대략 3가지 정도의 방법이 있다.
- 매개변수를 CPU 레지스터 내에 전달한다. 이 경우에 매개변수의 갯수가 CPU 내의 총 레지스터 개수보다 많을 수 있다.
- 위와 같은 경우에 매개변수를 메모리에 저장하고 메모리의 주소가 레지스터에 전달된다. (아래 그림 참고)
- 매개변수는 프로그램에 의해 스택(stack)으로 전달(push) 될 수도 있다.
그림.레지스터 메모리를 사용한 매개변수를 전달
pintOS(kaist)의 경우 X86-64 주처리장치(CPU)를 사용하는 운영체제인데, 이는 64비트 값을 저장할 수 있는 16개의 범용 정수 레지스터를 보유하고 있다.
이곳에서 system call (줄여서 syscall)은
- %rax 가 system call 번호를 담는다. 각 번호는 enum을 통해 특정 system call 함수로 정의 되어있다.
- 4번쨰 argument는 %rcx가 아니라 %r10에 담긴다. 따라서 argument들은 순서대로 %rdi, %rsi, %rdx, %r10, %r8, and %r9 에 담겨 syscall 함수로 넘어간다.
'sw사관학교 정글 2기 > pintOS' 카테고리의 다른 글
pintOS 관련 링크들 모음 (0) | 2021.11.02 |
---|---|
WIL week11~12 pintOS Virtual Memory (0) | 2021.10.28 |
Velog.io에 필기 합니다. (0) | 2021.10.04 |
댓글