GNU/Linux >> Tutoriels Linux >  >> Linux

Comment profiter de l'objet VDSO avec son propre langage de programmation ?

Cela dépend si votre implémentation utilise C interface pour les utilitaires de bas niveau ou non.

Si votre implémentation de langage donne un accès direct aux appels système sans passer par le C wrapper vous n'avez pas besoin d'utiliser VDSO (vous pouvez par exemple générer le SYSENTER approprié instruction machine pour effectuer l'appel système), mais vous pouvez décider d'utiliser VDSO et en profiter ensuite. Dans ce cas, votre langage n'a même pas besoin de suivre toutes les conventions ABI, juste les conventions du noyau. (par exemple, vous n'avez pas besoin de la distinction calle-safe fournie par ABI sur les registres, et vous pouvez même éviter d'utiliser des piles).

Un exemple d'implémentation de langage n'utilisant même pas libc.so est Bones Scheme. Vous pourriez en trouver quelques autres.

Ma compréhension du VDSO est qu'il s'agit d'une abstraction, fournie par le noyau, pour faire abstraction des diverses petites différences (liées aux transitions user-land -> kernel) dans l'implémentation des appels système, entre les différentes familles de processeurs x86. Si vous avez choisi une cible de processeur particulière, vous n'avez pas besoin de VDSO et vous pouvez toujours l'éviter.

AFAIU, le VDSO est un objet partagé ELF, assis (sur ma Debian/AMD64 avec un noyau 3.8.3 récemment compilé) dans le segment ffffffffff600000-ffffffffff601000; vérifier exactement avec cat /proc/self/maps où est-ce que c'est). Il vous suffit donc de comprendre l'organisation des objets partagés ELF et d'en récupérer les symboles. Voir ceci et cela liens. Le VDSO utilise les conventions C pour les appels documentées dans la spécification ABI x86-64.

ELF est un format bien documenté. Et il en va de même pour les conventions ABI x86-64 (qui définissent précisément les conventions d'appel C et comment démarre exactement l'image d'un processus. Voir aussi la page de manuel execve(2)), et bien sûr la documentation du noyau, donc je ne comprends pas quel est votre problème. Je suis d'accord que comprendre ELF prend du temps (je l'ai fait il y a 10 ans, mais ma mémoire est rouillée). Lire aussi le <elf.h> fichier d'en-tête sur votre machine.

Par exemple; en cours d'exécution (sous zsh sur Debian 64 bits x86-64)

 % file $(which sash)
 /bin/sash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
      statically linked, for GNU/Linux 2.6.26,
      BuildID[sha1]=0x0347fcc08fba2f811f58af99f26111d0f579a9f6, stripped

 % ldd $(which sash)
 not a dynamic executable

  % sash
  Stand-alone shell (version 3.7)
  > ps |grep sash
  21635 pts/3    00:00:00 sash
  > cat /proc/21635/maps
  00400000-004da000 r-xp 00000000 08:01 4985590                            /bin/sash
  006da000-006dc000 rw-p 000da000 08:01 4985590                            /bin/sash
  006dc000-006e1000 rw-p 00000000 00:00 0 
  017e3000-01806000 rw-p 00000000 00:00 0                                  [heap]
  7fe4950e5000-7fe4950e7000 rw-p 00000000 00:00 0 
  7fff3f130000-7fff3f151000 rw-p 00000000 00:00 0                          [stack]
  7fff3f173000-7fff3f175000 r-xp 00000000 00:00 0                          [vdso]
  ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Voir aussi cette réponse.

Vous voulez probablement dans votre environnement d'exécution une version minimale d'un éditeur de liens dynamique capable d'analyser simplement le VDSO. Vous voulez certainement comprendre l'état exact dans lequel un processus est démarré, et en particulier le rôle de auxv , le vecteur auxiliaire (j'oublie vraiment ces détails, mais je me souviens qu'ils sont importants). Voir par ex. cet article

En fait, démarrer de manière fiable votre environnement d'exécution est probablement plus difficile que le problème VDSO.

Vous pouvez également lire le guide de l'assembly linux qui explique également certaines choses (mais plus sur x86 que sur x86-64)

BTW, le code de http://musl-libc.org/ (qui est une libc alternative) est beaucoup plus facile à lire et à comprendre (et vous apprendrez facilement comment ils font les liens dynamiques, les pthreads, etc.)


J'ai trouvé ces fichiers utiles dans l'arborescence du noyau Linux :

  • Documentation/ABI/stable/vdso (qu'est-ce que l'objet vDSO ?)
  • Documentation/vDSO/parse_vdso.c (Analyseur de référence pour l'objet vDSO)

L'objet vDSO est un objet partagé dynamique virtuel qui est toujours mappé dans l'espace d'adressage d'un processus amd64 sous linux. Il peut être utilisé pour implémenter des appels système rapides. Pour accéder aux fonctions à l'intérieur de l'objet vDSO, vous devez

  • localiser l'objet
  • extraire une adresse de la table des symboles

Les deux choses peuvent être faites avec l'implémentation de référence sous licence CC0 parse_vdso.c.


Linux
  1. Comment étendre les fonctionnalités de votre bureau Linux avec PlexyDesk

  2. Comment commencer à apprendre un langage de programmation

  3. Comment changer la langue de votre cPanel ?

  4. Comment comparer vos serveurs Ubuntu Linux avec la suite de tests Phoronix

  5. Comment écrire votre propre module de noyau Linux avec un exemple simple

Comment trouver l'emplacement de vos serveurs avec Traceroute et WHOIS

Comment :Introduction à la programmation - Programmation orientée objet

Comment installer le langage de programmation Go sur Ubuntu 20.04

Comment installer le langage de programmation Rust sur AlmaLinux 8

Comment installer le langage de programmation Rust sur Linux

Comment installer GoLang (langage de programmation Go) sous Linux