Linux

vDSO란

검정비니 2026. 9. 1. 10:48
728x90
반응형

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)

vDSO (virtual dynamically linked shared object)는 신중하게 선택된 커널 영역 루틴들의 집합을 사용자 영역 애플리케이션으로 내보내는 리눅스 커널 메커니즘이다.

이를 통해 애플리케이션은 시스템 호출 인터페이스로 커널 영역 루틴들을 호출할 때 생기는 문맥 교환의 페널티 없이, 프로세스 내에서 이러한 커널 영역 루틴들을 호출할 수 있게 된다.

 

vDSO는 vsyscall의 기능들을 제공함과 동시에 한계들을 극복하기 위해 개발되었다.

오직 4개의 시스템 호출만을 허용하는 작은 양의 할당된 메모리 그리고 각 프로세스에서 같은 주소를 갖음으로 인한 보안 위협을 가지는 vsyscall의 약점을 극복하게 된 것이다.

 

vDSO는 링킹과 로딩(표준 ELF 파일 형식)을 위한 표준 메커니즘을 사용한다.

 

vDSO는 몇몇 커널 기능들을 드러내는 사용자 공간에 할당된 메모리 공간이다.

vDSO는 더 안전한 메모리 공간 랜덤화와 4개 이상의 시스템 호출들을 제공하며 동적으로 할당된다(vsyscall은 정적으로 할당된다). vDSO 링크들은 glibc 라이브러리를 통해 제공된다.

만약 리눅스 커널이 vDSO 지원을 제공하지 않는다면 전통적인 syscall이 만들어진다.

반응형