Este es un pequeño sistema operativo de pasatiempos para jugar con cosas que nunca antes había hecho ... no pretende ser funcional, útil, seguro o confiable. Está destinado a ser aproximadamente divertido de implementar.
Si desea ver las últimas cosas que estoy haciendo, consulte la rama dev en este repositorio. En general, master debe compilar y ejecutar.
Comience en librs (el equivalente de LIBC para este proyecto).
user/src/main.rs como un programa de espacio de usuarios de ejemplo.cargo xbuild --target target.jsonPaginación
memory::paging::map_regionMensaje de copia cero para IPC. Para enviar un mensaje,
Estoy jugando con la idea de no tener procesos en absoluto, solo DAG de continuaciones que pueden o no elegir transmitir sus capacidades.
Actualmente es un poco más de 1500 LOC (sin incluir comentarios + espacios en blanco + dependencias). ¡Nada mal!
El núcleo en sí está basado en la continuación, en lugar de usar algo como Kthreads. En el primer pase, solo estoy haciendo que las cosas funcionen. Más tarde, podría regresar y hacerlo eficiente.
No se realizan una preferencia basada en el temporizador en el espacio de kernels o el espacio de usuarios (aunque se producen interrupciones del temporizador para que los temporizadores puedan funcionar). Sin bloqueos, sin múltiples subprocesos en el espacio de usuarios. Cada proceso es de un solo hilo y basado en la continuación. Cada Continuation puede devolver un conjunto de continuaciones adicionales que se ejecutarán en cualquier orden, un error o nada. Las continuaciones también pueden esperar eventos, como E/S o la terminación del proceso.
Espacio de direcciones individuales. Todo vive en el mismo espacio de direcciones. Los bits de entrada de la tabla de página se utilizan para deshabilitar ciertas partes del espacio de direcciones para algunas continuaciones.
Pequeño montón de núcleo para la asignación de memoria dinámica.
Asignador de amigos para la asignación de cuadros físicos.
Buddy Asignator para regiones espaciales de direcciones virtuales.
Sistema de capacidad simple para administrar el acceso a los recursos en el sistema, como las regiones de memoria.
Cambiar a Usermode y atrás.
El sistema llama a través de instrucciones syscall y sysret .
Carga de un binario ELF independiente de la posición como tarea en modo de usuario, ejecutándola y saliendo a través de un Syscall.
Ahora que tengo un núcleo básico en su mayoría en funcionamiento, ¡puedo comenzar a jugar con cosas!
óxido, noche
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) llvm-tools-preview COMPONENTE DE DISTRIBUCIÓN DE RUSTO A través de rustup component add llvm-tools-preview
cargo xbuild y cargo bootimage a través de cargo install cargo-xbuild bootimage
build-essentials Y Utilizos estándar: gcc , make , ld , objcopy , dd
qemu para correr
Para construir y correr
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run bootimage se puede aprobar opcionalmente --release de compilaciones optimizadas.