Comment accéder à la mémoire du kernel à partir du programme utilisateur sous Linux?

communication client et serveur dans rt linux. le client envoie les données et le serveur est le destinataire.UDP est utilisé pour la communication entre le client et le serveur. Lorsque le serveur (rt linux) reçoit les données du client, le kernel doit arrêter son travail et commencer à exécuter les nouvelles données. Je veux calculer l’heure à laquelle l’interruption se produit dans le kernel (horodatage). Sous rt-linux, toutes les opérations du système d’exploitation ont lieu dans le kernel. Donc, je calcule le temps d’interruption dans le code source du kernel. J’ai donc modifié le code source du kernel à l’emplacement /usr/src/linux-version/net/core/dev.c comme indiqué ci-dessous: Je calcule l’heure et la stocke dans un tampon skb.

// ce code est au niveau du pilote de périphérique réseau.

int netif_rx(struct sk_buff *skb) { __net_timestamp(skb);//I modify the code in kernel to get the timestamp and store in buffer } 

// après avoir stocké les données dans la mémoire tampon. Le kernel l’enverra aux couches supérieures comme IP, UDP, INET et enfin SOCKET de l’espace du kernel.

mais je veux lire le paquet timestamp de l’espace kernel par l’espace utilisateur. c’est à dire mon programme.

J’utilise recvfrom api pour lire les données du spacce du kernel (qui est dans la mémoire du kernel)

QUESTION: quelqu’un pourrait-il me dire comment accéder à la mémoire du kernel contenant les données d’horodatage du programme utilisateur?

Vous ne pouvez pas accéder directement à la mémoire du kernel à partir de l’espace utilisateur – vous devez utiliser une sorte d’API.

Vous pouvez:

  • Exporter l’horodatage via sysfs ou debugfs et le lire en tant que fichier normal
  • Ajoutez syscall pour que le kernel retourne la valeur d’horodatage actuelle
  • Un tas d’autres variantes folles comme le socket netlink ou la mémoire partagée