Esto es una serie de tutoriales para los desarrolladores aficionados a los Sistemas Operativos (OS)
que se están adentrando a la nueva arquitectura ARM de 64 bits ARMv8-A
architecture. Los tutoriales darán una guía paso a paso en cómo escribir un Sistema Operativo
monolítico desde cero.
Estos tutoriales cubren la implementación común de diferentes tareas de Sistemas Operativos, como
escribir en una terminal serie, configurar la memoria virtual y manejar excepciones de hardware (HW).
Todo mientras usamos la seguridad y velocidad que Rust
nos proporciona.
¡Divértanse!
Atentamente,
Andre (@andre-richter)
P.S.: Para otros lenguajes, por favor busquen los diferentes archivos README. Por ejemplo, README.CN.md
o README.ES.md
. Muchas gracias a nuestros
traductores 🙌.
README
y cada README
tendrá un pequeña sección de tl;dr
en donde se dará una pequeña perspectiva general de los cambios y se mostrará el código fuente diff
del tutorial anterior para que se puedan inspeccionar los cambios/adiciones que han ocurrido.
tl;dr
también tendrán una sección en la que se dará una explicación con todo lujo de detalle.
El plan a largo plazo es que cada tutorial tenga una buena explicación además del tl;dr
y el diff
; pero por el momento los únicos tutoriales
que gozan de una son los tutoriales en los que creo que el tl;dr
y el diff
no son suficientes para comprender lo que está pasando.QEMU
.UART
).make doc
en cada tutorial. Este comando te deja navegar el código documentado de una manera cómoda.make doc
Estos tutoriales están dirigidos principalmente a distribuciones de Linux. Muchas de las cosas vistas aquí también funcionan en macOS, pero esto solo es experimental.
(Solo para Linux) Asegúrate de que la cuenta de tu usuario está en el grupo docker
.
Prepara la Rust
toolchain. La mayor parte se hará automáticamente durante el primer uso del archivo rust-toolchain.toml.
Todo lo que nos queda hacer a nosotros es:
i. Si ya tienes una versión de Rust instalada:
cargo install cargo-binutils rustfilt
ii. Si necesitas instalar Rust desde cero:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
cargo install cargo-binutils rustfilt
En caso de que uses Visual Studio Code
, recomiendo que instales la extensión Rust Analyzer extension.
(Solo para macOS) Instala algunas Ruby
gems.
Ejecuta esto en la carpeta root del repositorio:
bundle install --path .vendor/bundle --without development
Esta serie trata de enfocarse lo máximo posible en tener una experiencia agradable para el usuario. Por lo tanto, se han dirigido muchos esfuerzos a eliminar la parte más difícil del desarrollo de los sistemas incorporados (embedded) tanto como se pudo.
Rust por sí mismo ya ayuda mucho, porque tiene integrado el soporte para compilación cruzada.
Todo lo que necesitamos para compilar desde una máquina con una arquitectura x86
a una Raspberry Pi
con arquitectura AArch64
será automáticamente instalado por rustup
. Sin embargo, además de usar
el compilador de Rust, también usaremos algunas otras herramientas, entre las cuales están:
QEMU
para emular nuestro núcleo en nuestra máquina principal.Minipush
para cargar el núcleo en una Raspberry Pi cuando queramos usando UART
.OpenOCD
y GDB
para hacer depuración ("debugging") en la máquina a instalar.Hay muchas cosas que pueden salir mal mientras instalamos y/o compilamos las versiones correctas de cada herramienta en tu máquina. Por ejemplo, tu distribución de Linux tal vez podría no proporcionar las versiones más recientes de paquetes que se necesiten. O tal vez te falten algunas dependencias para la compilar estas herramientas.
Esta es la razón por la cual usaremos Docker mientras sea posible. Te estamos proporcionando un contenedor que tiene todas las herramientas o dependencias preinstaladas. Si quieres saber más acerca de Docker y revisar el contenedor proporcionado, por favor revisa la carpeta docker del repositorio.
Ya que el núcleo desarrollado en este tutorial se ejecuta en hardware real, se recomienda que tengas un adaptador de puerto serie USB cable para sentir la experiencia completa.
CP2102
.GND
y GPIO
14/15
como se muestra en la parte inferior.chainloader
, que será el último archivo que necesitarás
copiar de manera manual a la tarjeta SD por el momento. Esto te permitirá cargar los núcleos de los tutoriales
durante el arranque usando UART
.La versión original de estos tutoriales empezó como un fork de los increíbles
tutoriales de programación en hardware en la RPi3 en C
de Zoltan Baldaszti. ¡Gracias por darme un punto de partida!
Este proyecto está licenciado por cualquiera de las siguientes licencias como alguna de tus dos opciones
A menos de que lo menciones, cualquier contribución enviada por ti para su inclusión en este trabajo, tal como se define en la licencia Apache-2.0, deberá tener doble licencia como se muestra en la parte superior, sin ningún cambio de términos o condiciones.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。