Os arquivos de cabeçalho definem uma interface: eles especificam como as funções no arquivo de origem são definidas.
Eles são usados para que um compilador possa verificar se o uso de uma função está correto, já que a assinatura da função (valor de retorno e parâmetros) está presente no arquivo de cabeçalho. Para esta tarefa, a implementação real da função não é necessária.
Você poderia fazer o mesmo com as fontes completas do kernel, mas você instalaria muitos arquivos desnecessários.
Exemplo: se eu quiser usar a função
int foo(double param);
em um programa eu não preciso saber como a implementação de foo
é, eu só preciso saber que ele aceita um único parâmetro ( double
) e retorna um inteiro.