動機

記錄用

syscall一般版

interrupt 0x80

vsyscall

後面cpu有了專門打syscall的指令,但是32/64的指令居然不同!!

32: sysenter, sysexit 64: syscall, sysret

但如果在runtime每次判斷要用那種其實很智障 所以,加一層vsyscall,讓kernel在開機時根據cpu載入對的vsyscall的程式(binary) 並在kernel space留下一段固定位置給userspace獨與執行

而這段位置怎麼讓userspace知道? ELF的auxiliary vector 的 AT_SYSINFO

vdso(virtual dynamic shared object)

vsyscall有兩個讓人怕的地方

  1. binary,不好debug(symbol table在哪)
  2. 這是固定位置,怕

所以後面有了vDSO,把這段程式變成ELF,就可以動態載入與load DWARF ELF複製到page,透過auxiliary vector 的 AT_SYSINFO_EHDR給addr

現在要用的話自然都是包在glibc __kernel_vsyscall _dl_vdso_vsym

同時有了vsyscall與vDSO就可以加速syscall,因為不用轉到kernel space(提權)

Ref

vDSO: 快速的 Linux 系統呼叫機制 https://alittleresearcher.blogspot.com/2017/04/linux-vdso-and-vsyscall-history.html The Definitive Guide to Linux System Calls