Por que a manipulação de eventos de alguns sistemas operacionais é escrita em asm em vez de c?

17

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?

MAKZ
fonte
5
"Principalmente em c" - e adivinhe qual é o resto? ;)
goldilocks
@goldilocks bem, está em montagem. Mas por que, enquanto outras partes estão em c?
MAKZ
4
Eu não sou especialista nisso, mas existem algumas coisas relacionadas a hardware de baixo nível que não podem ser feitas em C; estes são geralmente específicos da arquitetura. O "ASM 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.
25915 goldilocks
Como você define o registro do ponteiro da tabela do descritor global em C?
user253751

Respostas:

24

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.

Enrugamento
fonte
Este é realmente o principal motivo. Alguns compiladores C incorporados possuem extensões que permitem endereçar registros (geralmente por meio de constantes / variáveis ​​globais pré-declaradas). Eles podem fazer isso porque segmentam apenas uma arquitetura. Mas os compiladores C de uso geral visam muitas arquiteturas diferentes para tornar essas extensões razoáveis. Assim, eles geralmente apenas implementam um mecanismo de incorporação de asm (além disso, isso os tornaria fora do padrão) #
slebetman
18

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>e include/asm-<arch>onde <arch>está um nome de arquitetura específico. Na verdade, é apenas uma pequena parte da fonte completa do kernel.

qualquer um
fonte
6

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, 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.

Krishna S Santosh
fonte
-5

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.

Escoce
fonte
2
A otimização da tecnologia do compilador C se tornou muito boa. É um mito que o asm seja geralmente muito mais rápido que o C. Em qualquer caso, não é por isso que as operações de sistema operacional de baixo nível usam o asm. Na maior parte tem a ver com as operações que não podem ser expressos em C como barreiras de memória, e registrar danças para convenções de chamada não-C, etc ...
Celada