Minha pergunta é por que hoje em dia alguma manipulação de eventos 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?
17
foobar()
embutido " é frequentemente usado no código C para esse fim, portanto, por exemplo , será definido usando montagem embutida, uma maneira em uma plataforma e outra em outra. Isso mantém o uso de asm no mínimo, mas não pode ser completamente evitado.Respostas:
A linguagem abstrai o acesso a registros de CPU e um sistema operacional ao manipular eventos precisa salvar o contexto; portanto, ele precisa acessar os registros no ponto do evento, quebrando, assim, a especificação C.
fonte
C é uma abstração do código da máquina que é executado na máquina (embora muito mais próximo do que a maioria dos outros idiomas).
Para essas coisas, são usadas 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 do compilador C, principalmente na forma de assembler em linha .
Na árvore de código-fonte do kernel, isso é armazenado em
arch/<arch>
einclude/asm-<arch>
onde<arch>
está um nome de arquitetura específico. Na verdade, é apenas uma pequena parte da fonte completa do kernel.fonte
Você não pode fazer isso em C :)
Estou tentando entrar no modo protegido x86. Obviamente, ainda posso fazer isso em C "emitindo" códigos de máquina brutos, mas ainda assim, caso precise acessar compensações precisas - estou sem sorte principalmente.
O segundo exemplo é o BootLoader. Em sistemas x86, é necessário que o código de inicialização tradicional tenha exatamente 512 bytes de comprimento e os dois últimos bytes sejam 0xAA e 0x55 (ou 55 AA exatamente), respectivamente ... trabalho de uma maneira fantástica.
Existem muitos outros casos em que a Assembléia não é apenas preferível - mas é o único meio.
fonte
o asm é mais fino e geralmente muito mais rápido que C associado a bibliotecas, etc., e o sistema operacional está lidando com muitos eventos o tempo todo. Você quer fino e rápido para esta função.
fonte