Używanie nagłówków jądra w czasie rzeczywistym do kompilowania kodu przestrzeni użytkownika a domyślne nagłówki

11

Zgodnie z wymaganiami klienta zainstalowałem CentOS 5.6 z domyślnym jądrem. Po zainstalowaniu tego jądra plik time.h zawiera plik #define CLOCK_MONOTONIC.

Teraz zostało zainstalowane jądro czasu rzeczywistego wraz z jądrem-devel i nasz kod chciałby użyć CLOCK_MONOTONIC_RAW. Istnieje jako część plików nagłówkowych jądra, ale kiedy kompiluję nasz kod, nie znajduje go w standardowej przestrzeni użytkownika.

Moje pytanie brzmi: jaka jest właściwa procedura włączania / zastępowania time.hznalezionego domyślnie jądra w czasie rzeczywistym? Z moich badań wynika, że ​​dowiązania symboliczne są złe, więc jak sobie z tym poradzić? Jaka jest procedura lub proces? Aktualizacja do CentOS 6.0 lub 5.7 nie jest opcją dla wymagań klienta.

cabanaboy
źródło
Czy planujesz wstawić ten moduł do domyślnego jądra CentOS?
bahamat

Odpowiedzi:

1

Należy wyróżnić, skąd pochodzą pliki nagłówkowe:

  • <time.h>jest dostarczany przez glibc (np. glibc-headerspakiet)
  • <linux/time.h> jest dostarczany przez nagłówki jądra Linux.

Zmiana jądra i jego pakietów nagłówkowych nie wpłynie na to <time.h>. Wystarczy zmiana glibc.

Powinieneś znaleźć, że glibc <time.h>zawiera, <bits/time.h>które rozwiązuje jak np. /usr/include/x86_64-linux-gnu/bits/time.hI definiuje CLOCK_MONOTONIC_RAW. Jeśli tak się nie stanie i nie możesz go zaktualizować, musisz zastosować kod taki jak ten:

#include <time.h>
#ifndef CLOCK_MONOTONIC_RAW
# define CLOCK_MONOTONIC_RAW 4
#endif
Stuart Caie
źródło
0

Musisz tylko #include <linux/time.h>

psusi
źródło
Dziękuję za odpowiedź. Sprawdziłem lokalizację linux / time.h i ona również nie ma odniesienia do „RAW”. Używam zaktualizowanego jądra w czasie rzeczywistym, ale muszę tylko zrozumieć, jak przenieść nagłówki nowego jądra, które mają odniesienie do „RAW” do plików nagłówka przestrzeni użytkownika. Czy mam jakiś sens, czy moje podejście jest prawidłowe? Jeszcze raz dziękuję za pomoc.
cabanaboy
@ cabanaboy, nie jestem pewien, gdzie szukasz ani skąd pochodzi plik, ale linux / time.h z pewnością powinien zdefiniować CLOCK_MONOTONIC_RAW. Nie ma również znaczenia, czy używasz jądra w czasie rzeczywistym, czy nie; nagłówki są takie same.
psusi
3
@cabanaboy, czekaj ... używasz starego systemu operacyjnego, który musiał zostać dostarczony z jądrem starszym niż 2.6.28, gdy został dodany. Jak zainstalowałeś nowe jądro? Jeśli sam zbudowałeś go ze źródła, musisz make install_headers. Jeśli masz zaktualizowany pakiet jądra, musisz uzyskać odpowiedni zaktualizowany pakiet kernel_headers.
psusi
0

Nagłówki, które instaluje Twoja dystrybucja, nie są tymi w jądrze, są to wersje sanitzed / „userspaced”. Będziesz musiał pobrać kopię nagłówków w pliku include / linux w źródłach jądra i skonfigurować je tak, aby były używane zamiast tych w katalogu / usr / include / linux (musisz zmienić flagę -I dla gcc). I sprawdź, czy nic nie zapali się.

vonbrand
źródło
0

Upewniam się, że buduję na podstawie nagłówków dostarczonych z nowym jądrem. CLOCK_MONOTONIC_RAWnależy zdefiniować w linux/time.h. Najpierw dowiedz się, jakich nagłówków używasz, i sprawdź, jak zdefiniowano to w pliku. Możesz zdefiniować to w swoim kodzie (tylko jako czek), aby zobaczyć, co się stanie.

użytkownik3275885
źródło