Usando cabeçalhos do kernel em tempo real para compilar código do espaço do usuário versus cabeçalhos padrão


11

De acordo com os requisitos do cliente, instalei o CentOS 5.6 com o kernel padrão. Com esse kernel instalado, o arquivo time.h inclui o arquivo #define CLOCK_MONOTONIC.

Agora, um kernel em tempo real foi instalado junto com o kernel-devel e nosso código gostaria de usar CLOCK_MONOTONIC_RAW. Ele existe como parte dos arquivos de cabeçalho do kernel, mas quando eu compilo nosso código, ele não o encontra no espaço de usuário padrão incluído.

Minha pergunta é: qual é o procedimento adequado para incluir / substituir o time.hencontrado por padrão pelo kernel em tempo real? Na minha pesquisa, parece que os links simbólicos são ruins, então como deve ser tratado? Qual é o procedimento ou processo? A atualização para o CentOS 6.0 ou 5.7 não é uma opção de acordo com os requisitos do cliente.


Você está planejando inserir este módulo no kernel padrão do CentOS?
bahamat 18/07/12

Respostas:


1

Há uma distinção importante a ser feita sobre a origem dos arquivos de cabeçalho:

  • <time.h>é fornecido pela glibc (por exemplo, o glibc-headerspacote)
  • <linux/time.h> é fornecido pelos cabeçalhos do kernel do Linux.

Alterar o kernel e seus pacotes de cabeçalho não afetará <time.h>. Somente a alteração da glibc fará isso.

Você deve achar que o glibc <time.h>inclui o <bits/time.h>que resolve como por exemplo /usr/include/x86_64-linux-gnu/bits/time.he define CLOCK_MONOTONIC_RAW. Caso contrário, e você não pode atualizá-lo, será necessário incluir um código como este:

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

0

Você só precisa #include <linux/time.h>


Obrigado pela resposta. Eu verifiquei o local linux / time.h e ele também não tem uma referência a "RAW". Estou executando um kernel atualizado em tempo real, mas só preciso entender como transferir os cabeçalhos do novo kernel que têm uma referência a "RAW" nos arquivos de cabeçalho do espaço do usuário. Estou fazendo algum sentido ou minha abordagem está correta? Mais uma vez obrigado pela ajuda.
Cabanaboy

@cabanaboy, não tenho certeza de onde você está procurando ou de onde veio o arquivo, mas o linux / time.h certamente deve definir CLOCK_MONOTONIC_RAW. Também não importa se você está executando um kernel em tempo real ou não; os cabeçalhos são os mesmos.
precisa saber é

3
@cabanaboy, espere ... você está executando um sistema operacional antigo que deve ter sido enviado com um kernel anterior a 2.6.28 quando foi adicionado. Como você instalou o novo kernel? Se você o construiu a partir da fonte, precisará make install_headers. Se você recebeu um pacote de kernel atualizado, precisa obter o pacote kernel_headers atualizado correspondente.
precisa saber é

0

Os cabeçalhos que sua distribuição instala não são os do kernel, são versões com sanitzed / "userpaced". Você precisaria obter uma cópia dos cabeçalhos em include / linux nas fontes do kernel e configurá-los para que eles sejam usados ​​preferencialmente aos do / usr / include / linux (é necessário usar o sinalizador -I para o gcc). E verifique se nada falha.


0

Eu teria certeza de que estou construindo contra os cabeçalhos que acompanham o novo kernel. CLOCK_MONOTONIC_RAWdeve ser definido em linux/time.h. Primeiro descubra quais cabeçalhos você está usando e verifique como eles estão definidos no arquivo. Você pode defini-lo em seu código (apenas como uma verificação) para ver o que acontece.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.