Pourquoi int80h au lieu de sysenter est utilisé pour appeler des appels système?

Tous les manuels et ressources Internet me disent int 80h est un style obsolète pour appeler des appels système, et a été remplacé par SYSENTER sur les plates-formes x86.

Mais je viens de découvrir que mon système utilise toujours int 80h. Je connais le manuel comme VDSO, le wrapper libc qui implémente le service d’appels système, mais je ne comprends pas pourquoi int 80h est toujours utilisé par défaut.

  1. Quelqu’un peut-il me dire la raison? La glibc ou le kernel est trop vieux?

  2. De nos jours, dans quelles conditions “int 80h” est-il toujours utilisé par défaut?

  3. Comment puis-je appliquer sysenter sans installer une nouvelle glibc?


Voici mon environnement:

J’ai installé une machine virtuelle en utilisant VMWare sur mon macbook air 2011 (processeur Core Duo). Ubuntu 8.04 / kernel 2.6.24 32 bits (compilé à l’aide du fichier .config d’origine) / libc 2.7 dans la machine virtuelle.

Très probablement pour des raisons de compatibilité – Ubuntu 32 bits est compilé pour être compatible avec le processeur i386 (enfin, peut-être pas si vieux que ça), qui ne supportait pas sysenter (il n’apparaissait que sur Pentium 2 AFAIK). Apparemment, l’utilisation de sysenter contre int 80h n’est vraiment bénéfique que sur certains types de processeurs:

http://articles.manugarg.com/systemcallinlinux2_6.html

Par conséquent, s’il n’y a pas de gain de vitesse significatif dans le cas général et une compatibilité plus large, utiliser int 80h sur sysenter est toujours logique, même aujourd’hui. Si vous utilisez la version 64 bits d’Ubuntu, alors sysenter / sysexit est utilisé partout.

Edit: en réalité, le mécanisme d’appel système à utiliser est décidé par le kernel au démarrage, et non par la glibc. Cette page (section 4.6) explique comment cela fonctionne très bien. Dans votre cas, il se trouve que le kernel émulé par VMware est considéré par le kernel comme étant plus efficace en utilisant int 80h que sysenter. Vous devrez déboguer le kernel pour déterminer comment il prend cette décision.

Quelles instructions (int80 ou sysenter) sont toujours décidées par le système d’exploitation invité lui-même, comme vous pouvez le voir dans le code source du kernel Linux – tout dépend du matériel que VMware lui a présenté.

Regardez le fichier arch / x86 / vdso / vdso32-setup.c (code source du kernel Linux):

if (vdso32_syscall()) { vsyscall = &vdso32_syscall_start; vsyscall_len = &vdso32_syscall_end - &vdso32_syscall_start; } else if (vdso32_sysenter()){ vsyscall = &vdso32_sysenter_start; vsyscall_len = &vdso32_sysenter_end - &vdso32_sysenter_start; } else { vsyscall = &vdso32_int80_start; vsyscall_len = &vdso32_int80_end - &vdso32_int80_start; } 

De haut, vous pouvez voir que la décision d’utiliser int80 est uniquement lorsque la détection des fonctionnalités de sysenter a échoué. Et cette fonctionnalité est à son tour présentée au client via le moteur d’émulation de VMWare. Peut-être que si vous aviez utilisé la version la plus récente de VMware, ainsi que du matériel moderne, VMware devrait présenter un système d’exploitation plus moderne à l’invité.