'vDSO'에 해당되는 글 1건

  1. 2009.07.28 What is vDSO? 2

What is vDSO?

Personal Computer/Linux 2009. 7. 28. 13:52 posted by tolkien
What is linux-gate.so.1? - by Johan Petersson

요즘 linux desktop에서 ldd를 때려보면 linux-gate.so.1이라는 파일이 보인다.
[tolkien@tolkien tmp]$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb7f84000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7f66000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb7f4d000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7f45000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7df6000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7dde000)
    /lib/ld-linux.so.2 (0xb7f85000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7dda000)
    libattr.so.1 => /lib/libattr.so.1 (0xb7dd6000)
저건 vDSO(virtual Dynamic Shared Object)라는 것으로 최근 x86 cpu에서 보이는 sysenter 명령을 이용한다. 위 link에 자세히 설명이 되어 있는데, 간단히 설명하자면...
x86에서 system call을 들어가기 위해서 interrupt 0x80을 이용했는데, 이게 cpu가 빨라지면서 병목이 되어 버렸다는 거다. (보다 자세한 내용은 Re: What is VDSO?, 또는 Intel P6 vs P7 system call performance)
이에 대해 Intel에서 sysenter라는 명령어를 Pentium Pro부터 내놓았다. 하지만, 무척 많은 버그때문에 안 쓰이다가 Pentium III정도부터 쓰이기 시작. Linux는 2.6.12때부터, Windows는 XP부터 sysenter를 지원하기 시작한다.

기존 방식으로만 동작하는 cpu도 아직 있기에 linux는 둘 다 지원한다. linux kernel build하면 vdso-int80.so, vdso-systenter.so 두 file이 생기고, 둘 다 kernel image에 들어가서 booting시 syscall entry에 대해서 int 0x80을 쓸 것인지 sysenter를 쓸 것인지 동적으로 정한다고 한다.

systenter 명령어를 사용할 때, 문제가 되는 syscall이 있는데, 그것이 RESTART다. 그에 대해서 추가적으로 언급한 것이 Linus Torvalds is a disgusting pig and proud of it 이다.