Onde exatamente está o arquivo linux / kernel.h?

0

Eu estou lendo através do Guia de Programação do Módulo Kernel Linux de Salzman, e fiquei me perguntando sobre onde o arquivo linux / kernel.h está localizado. Não consegui encontrá-lo com find . Ou melhor, os arquivos que encontrei não tinham nenhuma macro printk priority neles.

    
por sarpu 28.03.2018 / 20:16

3 respostas

3

O cabeçalho linux/kernel.h que é usado para construções de módulo é o cabeçalho que é parte da fonte do kernel . Quando os módulos são criados na árvore de origem do kernel, essa é a versão usada.

Para construções de módulos externos, o processo de construção procura o cabeçalho em /lib/modules/$(uname -r)/build/include/linux/sched.h . Esse arquivo é fornecido pelos pacotes de cabeçalho do kernel, por exemplo. nos derivados do Debian, o pacote linux-headers-$(uname -r) .

O /usr/include/linux/kernel.h é destinado aos processos do usuário, não aos módulos do kernel.

As macros printk priority agora vivem em linux/printk.h e linux/kern_levels.h . Suponho que você esteja lendo o guia original , que é baseado na série 2.6 do kernel; Para kernels modernos, você deve ler o guia atualizado (atualmente para 4.15.2 ).

    
por 28.03.2018 / 22:10
2

No meu sistema Mint 18.x com a árvore de build-essential BUT e nenhuma fonte completa instalada -

user@localhost:~ $ locate kernel.h | grep \/kernel.h$
/usr/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-21/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-21/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.4.0-21-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.4.0-21-generic/include/config/firmware/in/kernel.h
/usr/src/linux-headers-4.4.0-53/include/linux/kernel.h
/usr/src/linux-headers-4.4.0-53/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.4.0-53-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.4.0-53-generic/include/config/firmware/in/kernel.h
/usr/src/linux-headers-4.8.0-53/include/linux/kernel.h
/usr/src/linux-headers-4.8.0-53/include/uapi/linux/kernel.h
/usr/src/linux-headers-4.8.0-53-generic/include/config/debug/kernel.h
/usr/src/linux-headers-4.8.0-53-generic/include/config/firmware/in/kernel.h

Por comentário de Jeff sobre sua pergunta, eu diria que mais vezes /usr/include/linux/kernel.h é o que será usado,

Tenho certeza que, se você extrair um tarball da árvore do kernel, ele também poderá ter outra cópia em sua estrutura de diretórios. Uma verificação rápida mostra todos eles como tamanhos diferentes ... ou arquivos vazios.

    
por 28.03.2018 / 20:48
1

a resposta para isso pode depender significativamente da distribuição Linux ... SUSE / SLES vs RHEL / Centos / Fedora vs debian vs mint e assim por diante,

e poderia também diferir com base nos tipos RPM do linux distros vs debian?

em qualquer caso, minha experiência é principalmente com o SLES versão 11.4, e por isso posso garantir

/usr/src/linux/include/linux/kernel.h

where for me   /usr/src/linux -> /usr/src/linux-3.0.101-108.21

uname -r    for me returns 3.0.101-108.21-default

quando eu atualizo o kernel para versões mais novas, o link soft muda de acordo com o kernel.h. Eu acho que é seguro dizer que se você está procurando pela versão do módulo do kernel de kernel.h ela estará sob alguma pasta relacionada a uname -r e será parte da fonte do kernel para sua distribuição linux.

    
por 28.03.2018 / 22:56