/*
* VDSO
*/
简言之VDSO就是为了改进用户态对一些频繁使用的调用的优化,把系统调用改成用户态的函数调用。
在某些架构中,每当内核加载一个ELF可执行程序时,内核都会在其进程地址空间中建立一个叫做vDSO mapping的内存区域。
vDSO是virtual dynamic shared object的缩写,表示这段mapping实际包含的是一个ELF共享目标文件,也就是俗称的.so。
ldd /bin/ls
linux-vdso.so.1 (0x00007fff5e1f1000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f59d2a0c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f59d281a000)
libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f59d2789000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f59d2783000)
/lib64/ld-linux-x86-64.so.2 (0x00007f59d2a7a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f59d2760000)
可以看到,vDSO mapping的名称叫linux-vdso.so.1,其映射的基地址每次都是不同的:
这利用了内核的ASLR特性,以解决vsyscall page固定映射地址的安全问题。
为了方便地利用ASLR特性,vDSO mapping的本体是一个ELF共享目标文件(x86-64下的文件名称叫做vdso64.so,位于内核源码arch/x86/entry/vdso/下)。