Verwenden von Echtzeit-Kernel-Headern zum Kompilieren von Userspace-Code im Vergleich zu Standard-Headern

11

Gemäß den Kundenanforderungen habe ich CentOS 5.6 mit dem Standardkernel installiert. Wenn dieser Kernel installiert ist, enthält die Datei time.h die #define CLOCK_MONOTONIC.

Jetzt wurde zusammen mit der Kernel-Entwicklung ein Echtzeit-Kernel installiert, den unser Code gerne verwenden würde CLOCK_MONOTONIC_RAW. Es existiert als Teil der Header-Dateien des Kernels, aber wenn ich unseren Code kompiliere, findet er ihn nicht in den Standard-Userspace-Includes.

Meine Frage ist, wie ist das richtige Verfahren zum Einschließen / Ersetzen des time.hgefundenen Standardwerts durch den Echtzeitkernel? Aus meiner Forschung geht hervor, dass Symlinks schlecht sind. Wie sollte damit umgegangen werden? Was ist das Verfahren oder der Prozess? Ein Upgrade auf CentOS 6.0 oder 5.7 ist gemäß den Kundenanforderungen keine Option.

Cabanaboy
quelle
Planen Sie, dieses Modul in den Standard-CentOS-Kernel einzufügen?
Bahamat

Antworten:

1

Es muss eine wichtige Unterscheidung getroffen werden, woher Header-Dateien stammen:

  • <time.h>wird von glibc bereitgestellt (zB das glibc-headersPaket)
  • <linux/time.h> wird von den Linux-Kernel-Headern bereitgestellt.

Das Ändern des Kernels und seiner Header-Pakete hat keine Auswirkungen <time.h>. Das kann nur durch Ändern von glibc erreicht werden.

Sie sollten feststellen, dass glibc <time.h>enthält <bits/time.h>, das als zB aufgelöst /usr/include/x86_64-linux-gnu/bits/time.hund definiert wird CLOCK_MONOTONIC_RAW. Wenn dies nicht der Fall ist und Sie es nicht aktualisieren können, müssen Sie auf folgenden Code zurückgreifen:

#include <time.h>
#ifndef CLOCK_MONOTONIC_RAW
# define CLOCK_MONOTONIC_RAW 4
#endif
Stuart Caie
quelle
0

Du musst nur #include <linux/time.h>

psusi
quelle
Danke für die Antwort. Ich habe den Speicherort von linux / time.h überprüft und es gibt auch keinen Verweis auf "RAW". Ich verwende einen aktualisierten Echtzeit-Kernel, muss aber nur verstehen, wie die Header des neuen Kernels, die einen Verweis auf "RAW" enthalten, in die Userspace-Header-Dateien übertragen werden. Mache ich irgendeinen Sinn oder ist mein Ansatz richtig? Nochmals vielen Dank für die Hilfe.
Cabanaboy
@cabanaboy, ich bin nicht sicher, wo Sie suchen oder woher die Datei stammt, aber linux / time.h sollte mit Sicherheit CLOCK_MONOTONIC_RAW definieren. Es spielt auch keine Rolle, ob Sie einen Echtzeitkernel ausführen oder nicht. Die Überschriften sind die gleichen.
Psusi
3
@cabanaboy, warte ... du hast ein altes Betriebssystem, das mit einem Kernel ausgeliefert worden sein muss, der älter als 2.6.28 ist, als das hinzugefügt wurde. Wie haben Sie den neuen Kernel installiert? Wenn Sie es selbst aus der Quelle erstellt haben, müssen Sie es tun make install_headers. Wenn Sie ein aktualisiertes Kernel-Paket erhalten haben, müssen Sie das entsprechende aktualisierte kernel_headers-Paket erhalten.
Psusi
0

Die Header, die Ihre Distribution installiert, sind nicht die im Kernel, sondern sanitzed / "userspaced" -Versionen. Sie müssten eine Kopie der Header in include / linux in den Kernelquellen abrufen und so einrichten, dass sie denen in / usr / include / linux vorgezogen werden (das -I-Flag für gcc muss frob sein). Und prüfen Sie, ob nichts fehlschlägt.

vonbrand
quelle
0

Ich würde sicherstellen, dass ich gegen die Header baue, die mit dem neuen Kernel geliefert wurden. CLOCK_MONOTONIC_RAWsollte definiert werden in linux/time.h. Finden Sie zuerst heraus, welche Header Sie verwenden, und überprüfen Sie, wie sie in der Datei definiert sind. Sie können es in Ihrem Code definieren (nur als Prüfung), um zu sehen, was passiert.

user3275885
quelle