Perché la gestione degli eventi di alcuni sistemi operativi è scritta in asm anziché in c?


17

La mia domanda è: perché oggigiorno un po 'di gestione degli eventi del sistema operativo è ancora scritta in linguaggio assembly invece di un linguaggio di livello superiore come C, quando il kernel stesso è scritto principalmente in C?


5
"Principalmente in c" - e indovina qual è il resto? ;)
Riccioli d'oro

@goldilocks è ben assemblato. Ma perché, mentre altre parti sono in c?
MAKZ,

4
Non ne sono esperto, ma ci sono alcune cose relative all'hardware di basso livello che non si possono fare in C; questi sono solitamente specifici dell'architettura. "Inline ASM" viene spesso utilizzato nel codice C a tale scopo, quindi ad esempio foobar()verrà definito, utilizzando l'assemblaggio inline, un modo su una piattaforma e un altro modo su un altro. Ciò riduce al minimo l'uso di asm, ma non può essere completamente evitato.
Riccioli d'oro

Come si imposta il registro puntatore tabella descrittore globale in C?
user253751

Risposte:


24

Il linguaggio impedisce l'accesso ai registri della CPU e un sistema operativo durante la gestione degli eventi deve salvare il contesto, quindi ha bisogno di accedere ai registri nel punto dell'evento, infrangendo così le specifiche C.


Questo è in realtà il motivo principale. Alcuni compilatori C incorporati hanno estensioni che consentono loro di indirizzare i registri (di solito tramite costanti / variabili globali pre-dichiarate). Possono farlo perché hanno come target solo un'architettura. Ma i compilatori C per scopi generici prendono di mira troppe architetture diverse per rendere ragionevoli tali estensioni. Quindi di solito implementano solo un meccanismo di incorporamento asm (inoltre, ciò li renderebbe non standard)
slebetman,

18

C è un'astrazione dal codice macchina che gira sulla macchina (anche se molto più vicina della maggior parte delle altre lingue).

Per queste cose vengono usate istruzioni di codice macchina che non possono essere espresse in C, e forse per l'ulteriore ottimizzazione non fornita dall'assemblatore del compilatore C, principalmente sotto forma di assemblatore in linea .

Nell'albero del codice sorgente del kernel questo è archiviato sotto arch/<arch>e include/asm-<arch>dove si <arch>trova un nome di architettura specifico. In realtà è solo una piccola parte del sorgente completo del kernel.


6

Non puoi farlo in C :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

Sto cercando di entrare in modalità protetta x86. Ovviamente posso ancora farlo in C "emettendo" codici macchina grezzi, ma nel caso in cui ho bisogno di accedere a offset precisi - sono sfortunato per lo più.

Il secondo esempio è BootLoader. Sui sistemi x86, è necessario che il codice di avvio tradizionale sia lungo esattamente 512 byte e che gli ultimi due byte siano rispettivamente 0xAA e 0x55 (o 55 AA esattamente) ... Garantire che una cosa del genere con i compilatori C sia un incubo e l'assemblatore fa il lavoro in modo fantastico.

Ci sono molti altri casi in cui l'Assemblea non è solo preferibile, ma è l'unico mezzo.


-5

asm è più sottile e generalmente molto più veloce di C con librerie ecc., e il sistema operativo gestisce MOLTI eventi TUTTO il tempo. Vuoi snella e veloce per questa funzione.


2
L'ottimizzazione della tecnologia del compilatore C è diventata piuttosto buona. È un mito che asm sarebbe generalmente molto più veloce di C. In ogni caso non è questo il motivo per cui le operazioni di sistema operativo di basso livello usano asm. Principalmente ha a che fare con operazioni che non possono essere espresse in C come barriere di memoria e che registra balli per convenzioni di chiamata non C, ecc ...
Celada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.