NoWayOS
ES
GitHub
MenúCerrar

Empiece aquí

Su primer sistema en QEMU

Arranque seL4 en QEMU con un dominio de protección en Rust, lea los tres archivos que definen un sistema, vea cómo seL4 detiene una parte que va demasiado lejos y recorra la interfaz de usuario con el ratón.

Un sistema NoWayOS es un conjunto de dominios de protección, las partes de un dispositivo, que arrancan juntos sobre seL4. Cada sistema arranca primero en QEMU, dentro del contenedor de desarrollo, y comprueba su propia salida. Esta página arranca el más pequeño y después algunos que muestran más.

Arranque hello

make qemu-test SYSTEM=hello

Esto compila el sistema hello, comprueba sus concesiones, arranca seL4 sin pantalla en QEMU y vigila lo que imprime. La prueba se supera cuando ha aparecido, en orden, cada línea que el sistema debe imprimir, y no ha aparecido nada prohibido.

Para arrancarlo usted mismo y observarlo, ejecute make qemu SYSTEM=hello. Salga de QEMU con Ctrl-A y después x.

Los tres archivos que definen un sistema

Cada sistema son tres archivos en systems/, junto al código Rust de pds/.

hello.system es la descripción de sistema de Microkit: cada dominio de protección, región de memoria, canal e interrupción que tiene el sistema. hello tiene un dominio de protección y nada más:

<system>
 <protection_domain name="hello" priority="1" stack_size="0x10000">
 <program_image path="nowayos-hello.elf" />
 </protection_domain>
</system>

hello.grants enumera todo lo que concede el sistema, un hecho por línea. La compilación falla si la descripción concede algo que no figura aquí, o si aquí figura algo que no concede, así que un cambio en lo que un sistema puede hacer siempre es visible en la revisión:

system demo
role hello app

pd hello priority=1 budget=1000 period=1000

hello.expect enumera las líneas que el sistema debe imprimir, en orden, y, tras un !, el texto que hace fallar la prueba en el acto dondequiera que aparezca:

NOWAYOS: rust pd starting
NOWAYOS: hello from rust

!MON|ERROR
!seL4(CPU
!panicked

El mismo archivo de salida esperada comprueba el sistema en una Raspberry Pi 5, a partir del registro serie de la placa.

El dominio de protección en sí

pds/hello/src/main.rs es el programa completo. Sigue la forma mínima del ejemplo de Microkit de rust-sel4: init se ejecuta una vez al inicio, y el gestor recibiría notificaciones si el sistema le diera algún canal.

#![no_std]
#![no_main]

use sel4_microkit::{Handler, Infallible, debug_println, protection_domain};

#[protection_domain]
fn init() -> HelloPd {
 debug_println!("NOWAYOS: rust pd starting");
 debug_println!("NOWAYOS: hello from rust");
 HelloPd
}

struct HelloPd;

impl Handler for HelloPd {
 type Error = Infallible;
}

No hay heap (cualquier reserva de memoria fallaría al enlazar), ni unsafe, ni dispositivo. La impresión solo funciona porque es una compilación de depuración: un núcleo de versión final no tiene consola de depuración.

Vea cómo seL4 detiene una parte

make qemu-test SYSTEM=isolation-test

Dos dominios de protección sonda intentan cada uno algo que no se les ha concedido: uno lee memoria que no tiene mapeada y el otro escribe en una página que solo puede leer. seL4 detiene a cada uno con un fallo, y un tercero que solo observa sigue funcionando intacto. La última línea de la prueba lo dice:

NOWAYOS: isolation-test: 2 of 2 forbidden accesses faulted and were contained; bystander still running

Más sistemas para probar

Sistema Lo que muestra
ipc-demo Dos dominios de protección intercambian registros tipados a través de un anillo compartido; un registro mal formado se rechaza
timer-demo El dominio de protección del temporizador atiende a dos clientes y entrega sus plazos en orden de vencimiento
supervisor-test El supervisor recibe un fallo y reinicia la placa, y el siguiente arranque encuentra su memoria limpia
ui-demo La sesión guionizada de la interfaz de usuario, con un hash de cada fotograma comprobado

Ejecute cualquiera de ellos con make qemu-test SYSTEM=NAME, o todos los sistemas con make qemu-test-all.

Recorra la interfaz de usuario

make qemu SYSTEM=ui-interactive VNC=1

La pantalla de QEMU se publica por VNC en localhost:5900 de su máquina, con una contraseña que se imprime solo para esa ejecución. En macOS, abra vnc://localhost:5900 (en el Finder: Ir, Conectarse al servidor) y recorra las pantallas de la demo haciendo clic.

Lo que deja la compilación junto a cada imagen

En build/BOARD/SYSTEM/ (para estos, build/qemu_virt_aarch64/hello/ y así sucesivamente), al lado de loader.img:

  • sel4-config.txt: la configuración de seL4 de la imagen, y si está dentro de las demostraciones de seL4. Una compilación de depuración dice claramente que no lo está. Consulte Seguridad.
  • sbom.cdx.json: una lista de materiales de software CycloneDX para la imagen: el núcleo, el cargador, cada dominio de protección y los crates que contiene, cada uno con su hash.
  • Los archivos de licencia de lo que contiene la imagen, como las licencias de la fuente y de los iconos.