Em um nível conceitual, o kernel é tudo que é executado em um nível "mais privilegiado" de proteção de hardware. Isso seria como ring 0 em processadores x86, modo de sistema em ARM, modo kernel em MIPS, modo supervisor em 68xxx, etc. O kernel geralmente é baseado em interrupções, tanto interrupções de software (chamadas do sistema) quanto interrupções de hardware (unidades de disco, rede cartões, temporizadores de hardware).
Nesse mesmo nível conceitual, "user land" é o que é executado no modo menos privilegiado (anel 3 em CPUs x86, modo de usuário em ARM ou MIPS, etc.). O user land aproveita a maneira como o kernel suaviza com pequenas diferenças de hardware, apresentando a mesma API para todos os programas. Por exemplo, algumas placas sem fio podem ter registros extras de controle em relação a outros, ou conter mais ou menos buffer interno para os pacotes de entrada. O código do driver considera essas diferenças (às vezes ignorando recursos avançados ou incomuns) e apresenta a mesma API de soquete para todos os programas.
Alguns processadores (por exemplo, x86, VAX, Alpha AXP) têm mais de dois modos, mas a arquitetura Unix genérica não usa os modos intermediários.
Os programas e processos que você vê rodando em Unix ou Linux ou * BSD são o usuário. Como os processos são preemptivos, na verdade você nunca vê o kernel sendo executado, você apenas vê efeitos colaterais, como um retorno de chamada do sistema read()
ou uma função de manipulador de sinal em execução.
Para responder à sua pergunta específica, no Unix, Linux, * BSD, um "driver" geralmente é um pequeno software que lida com as peculiaridades específicas de algum hardware: uma placa de rede, uma unidade de disco, uma placa de vídeo. . O software do driver quase sempre precisa ser executado no modo Ring 0 / supervisor / espaço do kernel para ter acesso a interrupções de hardware ou à memória mapeada do hardware ou qualquer outra coisa. O driver cuida de recursos de hardware específicos e faz com que o hardware se encaixe na visão padronizada ou convencionalizada do código do kernel de como o hardware deve funcionar. Portanto, a execução de um driver no terreno do usuário requer que o kernel mostre a um programa de usuário do usuário coisas como memória mapeada ou registros de dispositivos ou interrupções ou outros recursos especiais. Isso pode ser complicado, já que os recursos especiais que um dispositivo pode exigir não se encaixam facilmente na API usual do estilo Unix apresentada aos programas de terra do usuário. Além disso, o agendamento é um problema, já que os programas de usuários geralmente não respondem a interrupções tão rapidamente.