Existem várias boas razões para isso.
A linguagem de baixo nível de hoje foi a linguagem de alto nível de ontem
Sim, acredite ou não, era uma vez que o C era visto como uma linguagem de alto nível. Até 20 anos atrás era comum o suficiente para vê-lo descrito como uma linguagem de "nível médio". Este foi um tempo antes do OO ser tão popular quanto é hoje, o Java não existia, o C # não existia, até mesmo o C ++ ainda não estava devidamente padronizado.
Inércia Histórica
Os sistemas operacionais que você usa hoje têm raízes profundas na história. O Windows volta ao início / meados dos anos 80, o Unix volta ao início dos anos 70. Há um monte de código antigo em funcionamento nos sistemas operacionais, e você geralmente não quer reescrever código antigo em funcionamento.
Em algum momento você precisa ir até o hardware
Isso acontece no kernel, isso acontece nos drivers, isso acontece nos subsistemas de gerenciamento de memória, isso acontece no sistema de arquivos. Claro que você pode colocar uma camada de linguagem de alto nível sobre ela, mas você ainda precisa acessar mais diretamente o hardware que uma linguagem de nível mais baixo oferece.
Portabilidade
Não me refiro a portabilidade para hardware diferente ou um sistema operacional diferente, como é mais comumente entendido hoje; isso é mais sutil. Há uma grande vantagem em fornecer uma interface baseada em C para algo, e é esse o fato de que praticamente todas as outras linguagens existentes podem ser vinculadas a C. Até mesmo a API do Windows ainda é uma API baseada em C nos dias de hoje por essa razão. / p>
Preferência pessoal
Algumas pessoas preferem programar dessa maneira, e isso pode ser um fator importante. Por exemplo, Linus Torvalds tem um famoso discurso contra o C ++ que deixa bem claro que No que lhe diz respeito, C será sempre sua ferramenta de escolha para esse tipo de trabalho (o conteúdo do discurso e se você concorda ou não com ele é irrelevante para essa discussão; o fato de que o discurso existe é suficiente).
Juntas, elas devem estabelecer claramente por que um sistema operacional foi originalmente escrito em algo como C nos velhos tempos, e por que partes muito significativas dele - até hoje - permanecem assim.