動機
記錄用
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有兩個讓人怕的地方
- binary,不好debug(symbol table在哪)
- 這是固定位置,怕
所以後面有了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