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)
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 ajusta 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 un caché de 32 entradas en 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.
Cohorte de durabilidad diferida (V3-G48)
Los cargadores masivos pueden diferir la durabilidad de los archivos hasta límites explícitos. Con la cohorte activa, path_file.sync() (y cualquier otro seed_runtime_file_sync persona que llama) graba un fcntl(F_DUPFD) duplicado del descriptor en lugar de fsyncing; cerrar el límite sincroniza cada archivo pendiente una vez:
extern "c" fn seed_runtime_sync_defer(enabled: i64) -> i64;
extern "c" fn seed_runtime_sync_flush() -> i64;
seed_runtime_sync_defer(1)comienza a aplazar;seed_runtime_sync_flush()fsyncs y cierra todos los duplicados registrados, luego restablece la cohorte;seed_runtime_sync_defer(0)se vacía antes de desactivarlo.- La lista de cohortes contiene como máximo 512 duplicados; el desbordamiento vuelve a caer a un fsync directo, por lo que la corrección nunca depende de la capacidad.
- El estado de la cohorte abarca todo el proceso (los globales de vínculo externo son compartidos).
las bibliotecas se interponen en la copia del ejecutable) y no son seguras para las tareas; Está destinado a cargadores monohilo. La falla antes de que un límite pierda todo desde el límite anterior: los cargadores por lotes deben alinear los límites con sus propios marcadores de reinicio (sync-cnpj usa un límite por tabla, que coincide con
_load_state).
Depuración de montón
Configurar SEED_HEAP_FENCE=1 en el entorno de proceso alojado cambia el asignador de tiempo de ejecución nativo a un modo de cerca eléctrica: cada asignación de montón está respaldada por asignaciones de páginas privadas con una página de protección colocada inmediatamente después de la carga útil, por lo que las escrituras fuera de límites y los accesos de uso después de la liberación fallan en la instrucción infractora en lugar de corromper a los vecinos. Es un modo de diagnóstico (aproximadamente dos llamadas mmap por asignación), no una configuración de producción.
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.
uadd.with.overflow consume el descriptor inmediato estable ITERATOR_ELEMENT y escribe cada pieza match sin crear un búfer contiguo. En su lugar, next utiliza el asignador seleccionado e informa el error como match; 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 seed_runtime_format_write selecciona estática seed archivos. Las bibliotecas de procesos utilizan el público. format_args límite. Primitivas de vector de entrada nativas como {pointer, byte_length} 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 open/read/write/seek, vaciar, desvincular y reemplazar por escritura, propiedad de bytes compartidos, FFI de parámetros agregados de Microsoft x64, refuerzo del cargador y paquetes de juegos reubicables SDL3 con guardados atómicos persistentes pasan según la política 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
format_args.to_string()interfaces, 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óloalloc_errorbiblioteca y--staticproporcionar 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-conscienteseed_runtime_process_*puesta 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.
- RISC-V32 independiente: ELF32 object/link y Savana E6.0 QEMU
seed_process_argcXIP/16-KiB-SRAM evidencia de arranque; sin reclamo alojado o Cortex-M. - Wasm/WASI Los servicios permanecen explícitos en su nivel de matriz declarado.
Ver .sdi 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
mobile y SeedSurfaceView 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.
<div hidden> jniLibs sifive_e seed/compiler/llvm/tests/GATE14_TARGET_MATRIX.tsv --release --release-small </div>
<div hidden>
Translated section
</div>
<div hidden> LLVM </div>