.. _architecture:

SO3 Architecture
================

The overall architecture of SO3 follows a conventional operating system organization with a user space and a kernel space.
The user space represents all user files and applications; everything is accessible via a *standard* directory tree
through a root filesystem.

The set of directories/sub-directories are generated by a well-known `buildroot <buildroot_>`__ tool used to generate
embedded Linux systems through cross-compilation. It provides a fully configurable (i.e. customizable) well-profiled
user environment and can lead to a minimal sized root filesystem.

.. figure:: img/SO3_Architecture.png
   :scale: 50 %
    
   Overview of the SO3 environment with user and kernel space

As depicted on this figure, SO3 is a monolithic OS like Linux where all subsystems and drivers reside in the kernel space.
Major subsystems like Inter-Process Communication (IPC), scheduling, filesystem, networking, etc. including device drivers
exist and provide basic functionalities. The user space is made of a very simple set of lightweight applications (*ls*, 
*more*, *echo*, *cat*, etc.)

SO3 Kernel Space
----------------

The kernel space uses the device tree to have information related to hardware configuration like the RAM memory base and
size, device related information, and various system properties.

SO3 User Space
--------------

All user space files are located in ``usr/`` directory. Applications and the *libc* is in separated
directories.


The MUSL libc user space library
--------------------------------

SO3 integrates the `MUSL library <MUSL_libc_>`__ as *libc* for its user space application.

Not all functions are available in SO3, but the functions are enabled as soon as there is a necessity to have it.
Furthermore, more complex functions such as those used to manage ``pthreads`` for example are not activated since
only a minimal set of functionalities and features are present.

Please do not hesitate to start a discussion thread or simply ask for adding a new feature in ``musl`` as it becomes
necessary.



.. _MUSL_libc: https://musl.libc.org
.. _buildroot: https://buildroot.org


