O software tem que ser portátil. Se você compilar suas fontes C / C ++, então você não precisa saber se está executando i386 / x86_64 / arm / mips ou o que nunca. Os cabeçalhos estão ligados de tal maneira que o software compila.
Todos os outros arquivos de cabeçalho existem porque foram implementados muitos padrões diferentes, existem portas do BSD e assim por diante. Tantos deles são historicamente baseados. De onde cada um vem e por que eles estão lá tem muitas razões diferentes e com certeza vai explodir respostas.
E uma resposta para o asm-generic: stackoverflow