paulo1205
(usa Ubuntu)
Enviado em 17/11/2016 - 19:12h
O objetivo do Kernel é controlar dispositivos, incluindo processador, memória e discos, e cuidar do ciclo de vida de processos e de suas interações com os dispositivos suportados e entre si. Para fazer essas coisas, o kernel precisa executar instruções privilegiadas do processador.
O kernel faz essas coisas em benefício de outras aplicações que executem sobre ele. A aplicação pede ao kernel para escrever um arquivo, e o kernel trata de ver se aquele arquivo está num disco local, num disco remoto (via SAN, por exemplo) ou se é um objeto acessível através da rede. A aplicação não precisa de se preocupar com os detalhes que estão por trás da operação. Em vez disso, ela pode cuidar de funções que não dependem diretamente de acesso privilegiado ao hardware. Você não precisa estar dentro do kernel para converter uma string em inteiros ou vice-versa, nem para saber se essa string deve usar este ou aquele conjunto de caracteres, nem para calcular uma diferença entre duas datas Também não cabe ao kernel fazer mapeamento entre nomes e endereços IP e vice-versa (o kernel só usa IPs, mas as pessoas preferem nomes) ou entre o nome do usuário e o código numérico usado por esse usuário quando estiver usando um processo (o kernel só usa números, mas as pessoas preferem nomes de novo).
Do ponto de vista do kernel, a biblioteca padrão do C (libc) é uma aplicação. Essa aplicação faz muita coisa por e para as pessoas (particularmente programadores), inclusive dar um jeito de se comunicar com o kernel na linguagem esperada pelo kernel. Mas mesmo o fato de falar com o kernel para realização de algumas tarefas não tira da biblioteca seu caráter de aplicação, nem passa perto de esgotar suas funções. Grande parte da funcionalidade da libc é independente do kernel.
Não embutir a biblioteca dentro do kernel tem algumas razões de ser. Uma delas é não misturar coisas distintas. Outra razão é que o kernel depende de pouca coisa que existe dentro da libc, e muitas operações que poderiam ser tomadas como análogas são realizadas de modo diferentes. Por exemplo, ao alocar memória para si mesmo, o kernel possivelmente usa atributos diferentes daqueles que usaria para entregar memória para uma aplicação. Para outras funções semelhantes, como a
printk, que você citou como análoga a
printf(), a implementação do kernel é possivelmente
muito mais simples que a da libc, já que seu objetivo é produzir mensagens curtas, e certamente não precisa se preocupar com locales, formatos alternativos, dezenas de tipos de dados diferentes e com diferentes peculiaridades etc.