Primitive di sistema e runtime

Questa pagina descrive la pulizia operativa LLVM compilatore. Ne fanno parte le operazioni di basso livello seed stesso, non un linguaggio aggiuntivo, ma le applicazioni ordinarie dovrebbero utilizzare wrapper sicuri controllati in modo ristretto.

Profili di esecuzione

Profilo Significato
hosted servizi runtime della piattaforma selezionati dalla destinazione
freestanding immagine priva di libc con servizi esplicitamente selezionati
kernel restrizioni del kernel ABI/service e nessuna ipotesi ospitata
none nessun servizio runtime oltre target/compiler primitivi

Effetti (alloc, blocco, panico, I/O) vengono confrontati con quelli selezionati profile/service impostare. I profili non cambiano ownership/type semantica.

Linux-L'esecuzione ospitata nativa non ha libc obbligatoria. linux-libc è una scelta esplicita del runtime di interoperabilità. Freestanding/kernel gli obiettivi rimangono liberi da libc.

Memoria grezza digitata

unsafe fn use_buffer() -> result<i64, alloc_error> {
    let pointer = raw_try_alloc<i64>(4)?
    raw_write<i64>(pointer, 0, 42)
    let value = raw_read<i64>(pointer, 0)
    raw_free<i64>(pointer)
    result.ok(value)
}

Un ABI esterno che restituisce l'archiviazione della vista process/static-lifetime può dichiarare @static_view. Questa è un'asserzione di provenienza attendibile limitata a extern; la chiamata rimane unsafe e un normale wrapper di libreria sicura deve verificare la garanzia a vita estera.

Il substrato pulito e non sicuro lo è raw_try_alloc<t>, raw_null<t>, raw_is_null<t>, raw_read<t>, raw_write<t>, raw_free<t>, e raw_slice<t>. L'allocazione rifiuta i conteggi negativi, l'overflow della moltiplicazione e il fallimento dell'allocatore alloc_error. I chiamanti non sicuri rimangono responsabili dell'estensione, dell'allineamento, dell'inizializzazione, della provenienza, dell'aliasing e del rilascio esatto degli elementi.

raw_null<t>() produce la sentinella nulla interna utilizzata dai proprietari non sicuri controllati e raw_is_null<t>(pointer) la testa. Lo standard box<t> confina tali operazioni dietro il suo costruttore, consumando l'estrazione e il distruttore.

Linux-allocazioni native il cui carico utile più intestazione si adatta a 8 KiB e il cui allineamento è al massimo di 16 byte utilizzano classi di lastre precise (da 16 byte a 8 KiB). Gli plates vuoti da 1 MiB condividono una cache a 32 voci a livello di processo; le lastre vuote in eccesso non vengono mappate. Le allocazioni più grandi o più rigorosamente allineate rimangono mappature dirette a livello di pagina e vengono immediatamente non mappate.

Il runtime nativo fornisce anche l'ottimizzazione memcpy, memmove, e memset punti di ingresso senza libc. Suo sqrt(f64) il simbolo di runtime si abbassa al LLVM radice quadrata intrinseca, consentendo ai carichi di lavoro rigidi in virgola mobile di rimanere privi di libc.

Eredità alloc(type,n), indirizzo intero read/write, e free gli esempi appartengono a backend archiviati e non sono il compilatore pulito API.

Spazi di indirizzi e dispositivi

I tipi di puntatori grezzi possono essere identificati user, kernel, physical, mmio, o dma spazi di indirizzi. Rimangono distinti attraverso .sdi e LLVM abbassamento. Operazioni volatili digitate ed esplicite non sicure mapping/cast le transizioni vengono utilizzate per la memoria del dispositivo. compiler/llvm/libs/system crea wrapper nominali sicuri per MMIO, pagine, pin/DMA, inizializzazione e meccanismi locali della CPU.

Atomici

Il compilatore convalida gli helper acquire/release e le operazioni ordinate esplicite di caricamento, archiviazione, recupero-aggiunta, scambio, confronto-scambio e fencing. Le combinazioni di ordine load/store/CAS non valide vengono rifiutate. Gli atomici sono distinti dall'accesso ai dispositivi volatili. Un wrapper sicuro deve stabilire la durata dell'allocazione, l'allineamento, l'accesso condiviso e un protocollo atomico coerente.

FFI e ABI

Il target/ABI il livello assegna un interno esplicito seed, pubblico seed, piattaforma C, integrato nel compilatore, entry, interrupt e nudo ABI classi. .sdi include l'obiettivo, ABI, profilo di build, profilo di runtime e identità della funzionalità di runtime; conosciuto seed le mancate corrispondenze degli artefatti non vengono risolte con una diagnostica di ricostruzione. Straniero C/assembly gli oggetti non hanno n seed metadati del profilo e rimangono esplicitamente collegabili.

I confini FFI coperti includono scalari, puntatori grezzi, callback che non catturano, handle opachi e wrapper scalari C-struct basati su puntatori. Le strutture C per valore e la modellazione più ricca della piattaforma ABI rimangono limitate. Le chiamate straniere non sono sicure finché non vengono protette da una cassaforte controllata API.

Panico e pulizia

L'errore del controllo sicuro richiama la destinazione panic/trap politica. Panico, trappola e interruzione non si risolvono mai seed, FFI, libreria dinamica, interruzione, kernel/user o confini delle attività. Su questi bordi non viene eseguita alcuna pulizia lessicale o distruttore di utenti.

Runtime e librerie separate

I componenti integrati del compilatore utilizzano ID di simboli di runtime stabili anziché l'ispezione della stringa del nome sorgente. I servizi runtime eseguibili ospitati includono allocation/resource operazioni, processo entry/args/environment, output/files, time/randomness, descrittori di rete, hook dello scheduler, regioni, panico e interruzione al livello implementato da ciascuna riga di destinazione.

seed_runtime_format_write consuma il descrittore format_args immediato stabile e scrive ogni pezzo {pointer, byte_length} senza creare un buffer contiguo. format_args.to_string() utilizza invece l'allocatore selezionato e segnala l'errore come alloc_error; nessuno dei due percorsi richiede libc.

Le librerie dinamiche dichiarano i simboli di runtime richiesti e si risolvono in base a executable/runtime dominio. Le librerie installate sono target/ABI qualificato; il collegamento dinamico è predefinito e --static seleziona statico seed archivi. Le librerie di processi utilizzano il pubblico seed_runtime_process_* confine. Primitive native del vettore di ingresso come seed_process_argc rimangono nascosti all'interno dell'eseguibile e vengono raggiunti solo tramite wrapper di runtime esportati.

Livelli target

La matrice di destinazione dichiarativa separa l'emissione LLVM/object dal collegamento statico, dal collegamento dinamico, dall'eseguibile e dai livelli di esecuzione.

Vedi seed/compiler/llvm/tests/GATE14_TARGET_MATRIX.tsv piuttosto che dedurre capacità dalla presenza di un LLVM triplo.

Significato dello stivale

Per Gate 7, "avvio" significa che il compilatore emette un'immagine di destinazione, l'emulazione del sistema QEMU la carica attraverso il percorso firmware/machine dichiarato, il codice di ingresso di destinazione viene eseguito, scrive le prove di successo previste attraverso il meccanismo di destinazione ed esce o raggiunge lo stato terminale previsto. Ciò non significa che sia presente un sistema operativo completo, uno stack di driver, uno spazio utente o una libc.

Profili di rilascio

--release e --release-small preservare controlli sicuri. LLVM può rimuovere gli assegni solo se rivelati ridondanti. ThinLTO, PGO, collegamento statico, code/relocation modello, policy della zona rossa, voce, script del linker, destinazione, profilo di runtime e sysroot sono controlli espliciti indipendenti.