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.

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.