Utilizzo delle intestazioni del kernel in tempo reale per compilare il codice dello spazio utente rispetto alle intestazioni predefinite


11

Per esigenze del cliente, ho installato CentOS 5.6 con il kernel predefinito. Con questo kernel installato, il file time.h include il file #define CLOCK_MONOTONIC.

Ora, è stato installato un kernel in tempo reale insieme al kernel-devel e il nostro codice vorrebbe usare CLOCK_MONOTONIC_RAW. Esiste come parte dei file di intestazione del kernel, ma quando compilo il nostro codice, non lo trova nello spazio utente standard incluso.

La mia domanda è: qual è la procedura corretta per includere / sostituire il time.htrovato di default con il kernel in tempo reale? Dalla mia ricerca, sembra che i collegamenti simbolici siano cattivi, quindi come dovrebbe essere gestito? Qual è la procedura o il processo? L'aggiornamento a CentOS 6.0 o 5.7 non è un'opzione per i requisiti del cliente.


Stai pensando di inserire questo modulo nel kernel CentOS predefinito?
Bahamat,

Risposte:


1

C'è una distinzione chiave da fare riguardo alla provenienza dei file header:

  • <time.h>è fornito da glibc (ad es. il glibc-headerspacchetto)
  • <linux/time.h> è fornito dalle intestazioni del kernel Linux.

La modifica del kernel e dei relativi pacchetti di intestazione non avrà alcun effetto <time.h>. Solo cambiando glibc lo farà.

Dovresti trovare che <time.h>include glibc <bits/time.h>che si risolve come eg /usr/include/x86_64-linux-gnu/bits/time.he definisce CLOCK_MONOTONIC_RAW. In caso contrario, e non puoi aggiornarlo, dovrai ricorrere a includere codice come questo:

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

0

Devi solo farlo #include <linux/time.h>


Grazie per la risposta. Ho controllato la posizione di linux / time.h e anche questo non ha un riferimento a "RAW". Sto eseguendo un kernel aggiornato in tempo reale, ma ho solo bisogno di capire come trasferire le intestazioni del nuovo kernel che ha un riferimento a "RAW" nei file di intestazione dello spazio utente. Sto dando un senso o il mio approccio è corretto? Grazie ancora per l'aiuto.
Cabanaboy,

@cabanaboy, non sono sicuro di dove stai cercando o da dove provenga il file, ma linux / time.h sicuramente dovrebbe definire CLOCK_MONOTONIC_RAW. Inoltre, non importa se si esegue o meno un kernel in tempo reale; le intestazioni sono uguali.
psusi,

3
@cabanaboy, aspetta ... stai eseguendo un vecchio sistema operativo che deve essere stato spedito con un kernel più vecchio della 2.6.28 quando è stato aggiunto. Come hai installato il nuovo kernel? Se lo hai creato da te stesso, allora devi farlo make install_headers. Se hai un pacchetto kernel aggiornato, allora devi ottenere il pacchetto kernel_headers aggiornato corrispondente.
psusi,

0

Le intestazioni che installa la tua distribuzione non sono quelle nel kernel, sono versioni sanitz / "spazio utente". Dovresti ottenere una copia delle intestazioni in include / linux nei sorgenti del kernel e configurarle in modo da usarle in preferenza rispetto a quelle in / usr / include / linux (devi premere il flag -I per gcc). E controlla se nulla si guasta.


0

Mi assicurerei che sto costruendo contro le intestazioni fornite con il nuovo kernel. CLOCK_MONOTONIC_RAWdovrebbe essere definito in linux/time.h. Per prima cosa scopri quali intestazioni stai usando e controlla come è definito nel file. Puoi definirlo nel tuo codice (solo come un segno di spunta) per vedere cosa succede.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.