system call은 context-switch 비용이 상당히 많이 든다. 이를 해결하기 위한 방법으로 userspace에서 이를 처리하는 방법이 등장하였다.
이 방법이 vsyscall에 해당한다.
특히 gettimeofday()
와 같은 시간 관련 함수들의 경우 자주 호출되어야 하므로 context switch overhead가 상당하다.
gettimeofday()
함수를 예를 들어 설명할 것이다.
시간 관련 메모리는 커널 영역에 존재하는데, 이 메모리 영역 자체를 유저공간에 매핑함으로써 유저공간에서도 바로 시간과 관련된 정보를 읽어들일 수 있게 한다.
또한, 시간을 읽어들이는 코드 자체도 유저공간에 매핑하여 context-switch 없이 동작을 할 수 있게 된다.
애초에 vsyscall을 위한 메모리 영역이 적게 할당되어있는 탓에 4개의 system call만 포함이 되었다.
또한, vsyscall은 statically allocated 되었기 때문에 보안상 취약하다. 이러한 한계를 극복하기 위해서 vDSO가 등장하였다.
기능 자체는 vsyscall과 거의 동일하다.
위에서 언급했던 vsyscall의 한계점을 개선하였다.
만약 커널에서 vDSO를 지원하지 않는다면, 일반적인 syscall로 실행된다.