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.
- Linux x86-64: predefinito nativo ospitato chiuso e privo di libc.
- Linux AArch64: ospitato runtime/link con policy runner.
- Linux RISC-V64: solo oggetto ospitato; il bagagliaio indipendente è separato.
- Windows x86-64: PE/DLL/runtime/tasks/networking, cartella read/seek, la proprietà dei byte condivisi, l'FFI con parametri aggregati Microsoft x64, il potenziamento del caricatore e un pacchetto di gioco rilocabile SDL3 passano secondo la policy Wine richiesta.
- macOS x86-64: la superficie SDK esplicito executable/dylib/static/runtime/pthread è pronto per l'esecuzione Intel nativa richiesta.
- macOS arm64: la superficie equivalente è verificata dalla reticolazione; l'esecuzione non lo è rivendicato senza corridore.
- Android arm64 e x86-64: LLVM/object emissione, librerie statiche, condivise
librerie e semplici eseguibili con un sysroot esplicito NDK, inoltre
.sdiinterfacce, sono disponibili come porzione iniziale di destinazione mobile. L'adattatore nativo copre allocation/regions, compiti, I/O/filesystem/socket wrapper, Logcat, process/time/entropy, proprietà integrate e cancellazione del ciclo di vita; il Android-solomobilebiblioteca eSeedSurfaceViewfornire una cornice delimitata primitives/text, touch/key/IME ingresso, safe-area/display metriche, segnali di concentrazione e pressione della memoria, privati files/cache visualizzazioni di directory e un archivio di slot interi privati atomici per piccoli progress/settings valori; un Gradle/CMake/Kotlin/JNI modello host, ABI-consapevolejniLibsmessa in scena, package/run sono disponibili i comandi e la diagnostica del medico. Emulator/device l'esecuzione e la firma della produzione rimangono non verificate senza un file Android catena di strumenti e corridore. - indipendente x86-64/AArch64/RISC-V64: prova di avvio senza libc su Gate 7 livelli dichiarati.
- Wasm/WASI i servizi rimangono espliciti al livello di matrice dichiarato.
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.