A linguagem abstrai o acesso a registradores da CPU, e um SO ao manipular eventos tem que salvar o contexto, então precisa de acesso aos registradores no ponto do evento, quebrando assim as especificações C.
A minha pergunta é por que hoje em dia alguma manipulação de evento do sistema operacional ainda é escrita em linguagem assembly em vez de uma linguagem de nível superior como C, quando o próprio kernel é escrito principalmente em C?
C é uma abstração do código de máquina que é executado na máquina (embora muito mais próximo do que a maioria das outras linguagens).
Para essas coisas, instruções de código de máquina que não podem ser expressas em C, e talvez para a otimização extra não fornecida pelo conjunto de compilador C, são usadas principalmente na forma de .
Na árvore do código-fonte do kernel, isso é armazenado em arch/<arch>
e include/asm-<arch>
, em que <arch>
é um nome de arquitetura específico. Na verdade, é apenas uma pequena parte da fonte completa do kernel.
Você não pode fazer isso em C:)
lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
Estou tentando entrar no modo protegido x86. Obviamente, eu ainda posso fazer isso em C "emitindo" códigos brutos de máquina, mas ainda no caso de precisar acessar offets precisos - eu estou sem sorte na maior parte do tempo.
O segundo exemplo é o BootLoader. Em sistemas x86, é necessário que o código de boot tradicional tenha exatamente 512 bytes de comprimento e os dois últimos bytes sejam 0xAA e 0x55 (ou 55 AA exatamente), respectivamente ... Assegurando que tal coisa com compiladores C é um pesadelo e o assembler faz o trabalho de uma forma fantástica.
Existem muitos outros casos em que a Assembleia não é apenas preferível - mas é o único meio.
o asm é mais fino e geralmente muito mais rápido que o C com bibliotecas, etc., e o SO está lidando com MUITOS eventos o tempo todo. Você quer magro e rápido para esta função.