Utilisation d'en-têtes de noyau en temps réel pour compiler le code de l'espace utilisateur par rapport aux en-têtes par défaut


11

Selon les exigences du client, j'ai installé CentOS 5.6 avec le noyau par défaut. Une fois ce noyau installé, le fichier time.h inclut le fichier #define CLOCK_MONOTONIC.

Maintenant, un noyau en temps réel a été installé avec kernel-devel et notre code aimerait l'utiliser CLOCK_MONOTONIC_RAW. Il existe en tant que partie des fichiers d'en-tête du noyau, mais lorsque je compile notre code, il ne le trouve pas dans les espaces utilisateur standard.

Ma question est, quelle est la procédure appropriée pour inclure / remplacer le time.htrouvé par défaut avec le noyau en temps réel? D'après mes recherches, il semble que les liens symboliques soient mauvais, alors comment les gérer? Quelle est la procédure ou le processus? La mise à niveau vers CentOS 6.0 ou 5.7 n'est pas une option selon les exigences du client.


Envisagez-vous d'insérer ce module dans le noyau CentOS par défaut?
bahamat

Réponses:


1

Il y a une distinction clé à faire sur la provenance des fichiers d'en-tête:

  • <time.h>est fourni par glibc (par exemple le glibc-headerspaquet)
  • <linux/time.h> est fourni par les en-têtes du noyau Linux.

La modification du noyau et de ses packages d'en-tête n'affectera pas <time.h>. Seule la glibc changeante le fera.

Vous devriez trouver que la glibc <time.h>inclut <bits/time.h>qui se résout par exemple /usr/include/x86_64-linux-gnu/bits/time.het définit CLOCK_MONOTONIC_RAW. Si ce n'est pas le cas et que vous ne pouvez pas le mettre à niveau, vous devrez alors inclure du code comme celui-ci:

#include <time.h>
#ifndef CLOCK_MONOTONIC_RAW
# define CLOCK_MONOTONIC_RAW 4
#endif

0

Vous avez juste besoin de #include <linux/time.h>


Merci pour votre réponse. J'ai vérifié l'emplacement linux / time.h et il n'a pas non plus de référence à "RAW". J'utilise un noyau mis à jour en temps réel, mais j'ai juste besoin de comprendre comment transférer les en-têtes du nouveau noyau qui ont une référence à "RAW" dans les fichiers d'en-tête de l'espace utilisateur. Suis-je logique ou mon approche est-elle correcte? Merci encore pour l'aide.
cabanaboy

@cabanaboy, je ne sais pas d'où vous cherchez ni d'où vient le fichier, mais linux / time.h devrait très certainement définir CLOCK_MONOTONIC_RAW. Peu importe que vous exécutiez un noyau en temps réel ou non; les en-têtes sont les mêmes.
psusi

3
@cabanaboy, attendez ... vous utilisez un ancien système d'exploitation qui doit avoir été livré avec un noyau plus ancien que 2.6.28 lors de son ajout. Comment avez-vous installé le nouveau noyau? Si vous l'avez construit vous-même à partir de la source, vous devez le faire make install_headers. Si vous avez un package de noyau mis à jour, vous devez obtenir le package kernel_headers correspondant mis à jour.
psusi

0

Les en-têtes que votre distribution installe ne sont pas ceux du noyau, ce sont des versions contrôlées / "userpaced". Vous devriez obtenir une copie des en-têtes dans include / linux dans les sources du noyau et les configurer de manière à ce qu'ils soient utilisés de préférence à ceux dans / usr / include / linux (vous devez supprimer l'indicateur -I pour gcc). Et vérifiez si rien ne se trompe.


0

Je m'assurerais que je construis contre les en-têtes fournis avec le nouveau noyau. CLOCK_MONOTONIC_RAWdoit être défini dans linux/time.h. Recherchez d'abord les en-têtes que vous utilisez et vérifiez comment ils sont définis dans le fichier. Vous pouvez le définir dans votre code (uniquement à titre de vérification) pour voir ce qui se passe.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.