Primitivas del sistema y tiempo de ejecución
Esta página describe la limpieza operativa. LLVM compilador. Las operaciones de bajo nivel son parte de seed en sí, no es un lenguaje complementario, pero las aplicaciones ordinarias deberían consumir contenedores seguros auditados estrechos.
Perfiles de tiempo de ejecución
| Perfil | Significado |
|---|---|
hosted |
Servicios de tiempo de ejecución de plataforma seleccionados por el objetivo. |
freestanding |
imagen sin libc con servicios seleccionados explícitamente |
kernel |
restricciones del kernel ABI/service y sin suposiciones alojadas |
none |
no hay servicios de tiempo de ejecución más allá target/compiler primitivos |
Efectos (alloc, bloqueo, pánico, I/O) se comparan con los seleccionados profile/service conjunto. Los perfiles no cambian ownership/type semántica.
Linux-La ejecución alojada nativa no tiene libc obligatorio. linux-libc es una elección explícita de tiempo de ejecución de interoperabilidad. Freestanding/kernel los objetivos permanecen libres de libc.
Memoria bruta escrita
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 externo que devuelve el almacenamiento de vista process/static-lifetime puede declarar @static_view. Esta es una afirmación de procedencia confiable restringida a extern; la llamada sigue siendo unsafe y un contenedor de biblioteca seguro ordinario debe auditar la garantía de por vida extranjera.
El sustrato limpio e inseguro es raw_try_alloc<t>, raw_null<t>, raw_is_null<t>, raw_read<t>, raw_write<t>, raw_free<t>, y raw_slice<t>. La asignación rechaza recuentos negativos, desbordamiento de multiplicación y falla del asignador con alloc_error. Las personas que llaman inseguras siguen siendo responsables de la extensión, la alineación, la inicialización, la procedencia, el alias y la liberación exacta de elementos.
raw_null<t>() produce el centinela nulo interno utilizado por propietarios no seguros auditados y raw_is_null<t>(pointer) lo prueba. El estándar box<t> confina esas operaciones detrás de su constructor, extracción consumidora y destructor.
Linux Las asignaciones nativas cuya carga útil más encabezado se ajustan a 8 KiB y cuya alineación es como máximo de 16 bytes utilizan clases de losa precisas (de 16 bytes a 8 KiB). Las losas vacías de 1 MiB comparten una caché de 32 entradas para todo el proceso; las losas vacías sobrantes no se asignan. Las asignaciones más grandes o más estrictamente alineadas siguen siendo asignaciones directas de páginas redondeadas y se desasignan inmediatamente.
El tiempo de ejecución nativo también proporciona optimización introducida memcpy, memmove, y memset puntos de entrada sin libc. su sqrt(f64) El símbolo de tiempo de ejecución baja al LLVM intrínseco de raíz cuadrada, lo que permite que las cargas de trabajo estrictas de punto flotante permanezcan libres de libc.
Legado alloc(type,n), dirección entera read/write, y free los ejemplos pertenecen a backends archivados y no son el compilador limpio API.
Espacios de direcciones y dispositivos
Los tipos de puntero sin formato pueden identificar user, kernel, physical, mmio, o dma espacios de direcciones. Se mantienen distintos a través de .sdi y LLVM bajando. Operaciones volátiles escritas y explícitamente inseguras mapping/cast Las transiciones se utilizan para la memoria del dispositivo. compiler/llvm/libs/system construye envoltorios nominales seguros para MMIO, páginas, pin/DMA, inicialización y mecanismos locales de CPU.
atómica
El compilador valida los ayudantes acquire/release y las operaciones ordenadas explícitas de carga, almacenamiento, recuperación, adición, intercambio, comparación-intercambio y valla. Se rechazan las combinaciones de pedidos load/store/CAS no válidas. Los atómicos son distintos del acceso a dispositivos volátiles. Un contenedor seguro debe establecer la vida útil de la asignación, la alineación, el acceso compartido y un protocolo atómico consistente.
FFI y ABI
La capa target/ABI asigna clases internas explícitas seed, pública seed, plataforma C, compilador integrado, entrada, interrupción y ABI desnuda. .sdi incluye destino, ABI, perfil de compilación, perfil de tiempo de ejecución e identidad de característica de tiempo de ejecución; Las discrepancias de artefactos seed conocidas fallan y se cierran con un diagnóstico de reconstrucción. Los objetos C/assembly externos no tienen metadatos de perfil seed y permanecen explícitamente vinculables.
Los límites de FFI cubiertos incluyen escalares, punteros sin formato, devoluciones de llamada sin captura, identificadores opacos y envoltorios de estructuras C escalares basados en punteros. Las estructuras C por valor y el modelado de plataforma más rica ABI siguen siendo limitados. Las llamadas al extranjero no son seguras hasta que estén protegidas por una caja fuerte comprobada API.
Pánico y limpieza
La falla de verificación segura invoca el objetivo panic/trap política. El pánico, la trampa y el aborto nunca desaparecen seed, FFI, biblioteca dinámica, interrupción, kernel/user o límites de tareas. No se ejecuta ninguna limpieza léxica ni destructor de usuario en esos bordes.
Tiempo de ejecución y bibliotecas separadas
Las funciones integradas del compilador utilizan ID de símbolos de tiempo de ejecución estables en lugar de la inspección de cadenas de nombres de fuentes. Los servicios de tiempo de ejecución ejecutables alojados incluyen allocation/resource operaciones, proceso entry/args/environment, output/files, time/randomness, descriptores de red, enlaces del programador, regiones, pánico y aborto en el nivel implementado por cada fila de destino.
seed_runtime_format_write consume el descriptor inmediato estable format_args y escribe cada pieza {pointer, byte_length} sin crear un búfer contiguo. En su lugar, format_args.to_string() utiliza el asignador seleccionado e informa el error como alloc_error; ninguna ruta requiere libc.
Las bibliotecas dinámicas declaran los símbolos de tiempo de ejecución requeridos y se resuelven según el executable/runtime dominio. Las bibliotecas instaladas son target/ABI calificado; El enlace dinámico es predeterminado y --static selecciona estática seed archivos. Las bibliotecas de procesos utilizan el público. seed_runtime_process_* límite. Primitivas de vector de entrada nativas como seed_process_argc permanecen ocultos dentro del ejecutable y solo se accede a ellos a través de contenedores de tiempo de ejecución exportados.
Niveles objetivo
La matriz de destino declarativa separa la emisión LLVM/object de los niveles de enlace estático, enlace dinámico, ejecutable y de ejecución.
- Linux x86-64: predeterminado nativo alojado cerrado y libre de libc.
- Linux AArch64: runtime/link alojado con política de corredor.
- Linux RISC-V64: solo objeto alojado; El maletero independiente está separado.
- Windows x86-64: PE/DLL/runtime/tasks/networking, archivo read/seek, propiedad de bytes compartidos, FFI de parámetros agregados de Microsoft x64, refuerzo del cargador y un paquete de juego SDL3 reubicable pasan según la política de Wine requerida.
- macOS x86-64: la superficie del SDK explícito executable/dylib/static/runtime/pthread es listo para la ejecución Intel nativa requerida.
- macOS arm64: la superficie equivalente está verificada por reticulación; la ejecución no es reclamado sin corredor.
- Android arm64 y x86-64: LLVM/object emisión, bibliotecas estáticas, compartidas
bibliotecas y ejecutables simples con una raíz del sistema NDK explícita, además
.sdiinterfaces, están disponibles como un segmento de destino móvil inicial. El adaptador nativo cubre allocation/regions, tareas, I/O/filesystem/socket envoltorios logcat, process/time/entropy, propiedad incorporada y cancelación del ciclo de vida; el Android-sólomobilebiblioteca ySeedSurfaceViewproporcionar marco delimitado primitives/text, touch/key/IME entrada, safe-area/display métricas, señales de concentración y presión de la memoria, privadas files/cache vistas de directorio y un almacén atómico privado de espacios enteros para pequeños progress/settings valores; un Gradle/CMake/Kotlin/JNI plantilla de host, ABI-conscientejniLibspuesta en escena, package/run comandos y diagnósticos médicos están disponibles. Emulator/device La ejecución y la firma de producción permanecen sin verificar sin un Android cadena de herramientas y corredor. - independiente x86-64/AArch64/RISC-V64: evidencia de arranque sin libc en Gate 7 niveles declarados.
- Wasm/WASI los servicios permanecen explícitos en su nivel de matriz declarado.
Ver seed/compiler/llvm/tests/GATE14_TARGET_MATRIX.tsv en lugar de inferir capacidades a partir de la presencia de un LLVM triple.
Significado de la bota
Para Gate 7, "arranque" significa que el compilador emite una imagen de destino, la emulación del sistema QEMU la carga a través de la ruta firmware/machine declarada, el código de entrada de destino se ejecuta, escribe la evidencia de éxito esperada a través del mecanismo de destino y sale o alcanza el estado terminal esperado. No significa que esté presente un sistema operativo completo, una pila de controladores, un espacio de usuario o una libc.
Perfiles de lanzamiento
--release y --release-small preservar controles seguros. LLVM podrá retirar los cheques sólo cuando resulte redundante. ThinLTO, PGO, enlace estático, code/relocation El modelo, la política de zona roja, la entrada, el script del vinculador, el destino, el perfil de tiempo de ejecución y sysroot son controles independientes explícitos.