vsyscall / vDSO

dandb3·2024년 7월 29일
0

이것저것 TMI

목록 보기
18/18

system call은 context-switch 비용이 상당히 많이 든다. 이를 해결하기 위한 방법으로 userspace에서 이를 처리하는 방법이 등장하였다.

이 방법이 vsyscall에 해당한다.

특히 gettimeofday() 와 같은 시간 관련 함수들의 경우 자주 호출되어야 하므로 context switch overhead가 상당하다.

vsyscall

gettimeofday() 함수를 예를 들어 설명할 것이다.

시간 관련 메모리는 커널 영역에 존재하는데, 이 메모리 영역 자체를 유저공간에 매핑함으로써 유저공간에서도 바로 시간과 관련된 정보를 읽어들일 수 있게 한다.

또한, 시간을 읽어들이는 코드 자체도 유저공간에 매핑하여 context-switch 없이 동작을 할 수 있게 된다.

한계

애초에 vsyscall을 위한 메모리 영역이 적게 할당되어있는 탓에 4개의 system call만 포함이 되었다.
또한, vsyscall은 statically allocated 되었기 때문에 보안상 취약하다. 이러한 한계를 극복하기 위해서 vDSO가 등장하였다.

vDSO (virtual Dynamic Shared Object)

기능 자체는 vsyscall과 거의 동일하다.

위에서 언급했던 vsyscall의 한계점을 개선하였다.

  • 4개보다 더 많은 syscall을 사용 가능하다.
  • dynamic allocate -> 고정된 주소에 매핑되지 않는다.

만약 커널에서 vDSO를 지원하지 않는다면, 일반적인 syscall로 실행된다.

profile
공부 내용 저장소

0개의 댓글