>but services that give you shell access to a user under a traditional kernel have mostly died out.
Shared hosting is alive and well, shell access is becoming more common to my knowledge.
>Hypervisors also tend to make it easier to divide system resources, e.g. by giving each VM a fixed RAM allocation.
CGroups. LXC and Docker are capable of RAM limits nowadays.
>traditional syscall interfaces tend to be more complex and thus have more attack surface than the VM<->hypervisor interface
A syscall interface is an assembly instruction and several registers that may point to some memory. The kernel is very thorough in checking the validity of such pointers (unless you use an ancient non-LTS kernel)
> give virtual machines direct access to (custom) networking hardware, rather than making them trap to the hypervisor for every send and receive.
Yes, VFIO and IOMMU have been around for a while. They do get pretty close to native performance (close enough for gaming atleast). It's not exactly new tech and full VMs with Linux images have been able to utilize full speed networking for a while now too.
Also note that virtio adapters are close to baremetal even without passthrough of the adapter.
>Anyway, unikernels can put everything from filesystems and TCP to threading and even page table management "in-process"; this can reduce the number of syscalls that have to be performed and thus syscall overhead
For all the stuff you mentioned syscall overhead isn't the driving performance factor unless you're google or facebook scale. TCP, threading, filesystems do spend most of their time waiting for DMA or other interrupts.
Page tables is usually not even a syscall and rather a interrupt from the CPU, the performance difference should be negligible.
> In other words, they shouldn't be compared to just libc; they're also taking over many of the functions of a traditional kernel (just not all of them).
It should be compared to libc because in the ideal deployment scenario there should be no difference.