blob: 84e7095ae76fb4b52744f3892ebeba3387e24cb1 [file] [log] [blame] [view] [edit]
Fuchsia Boot Sequence
=====================
This document describes the boot sequence for Fuchsia from the time the Zircon
layer hands control over to the Garnet layer. This document is a work in
progress that will need to be extended as we bring up more of the system.
# Layer 1: [appmgr](/src/sys/appmgr)
`appmgr`'s job is to host the environment tree and help create
processes in these environments. Processes created by `appmgr`
have an `zx::channel` back to their environment, which lets them create other
processes in their environment and to create nested environments.
At startup, `appmgr` creates an empty root environment and creates
the initial apps listed in `/system/data/appmgr/initial.config` in
that environment. Typically, these applications create environments nested
directly in the root environment. The default configuration contains one initial
app: `bootstrap`.
# Layer 2: [sysmgr](/src/sys/sysmgr/)
`sysmgr`'s job is to create the boot environment and create a number of
initial components in the boot environment.
`sysmgr` provides services that are not offered in the boot environment itself.
When `sysmgr` receives a request for a service for the first time, `sysmgr`
creates the appropriate application to implement that service and routes the request
to that application. Subsequent requests are routed to the already running
application. If the application dies, it is restarted automatically
the next time a service attempts to connect to that application.
By default, `sysmgr` reads all configuration files from `/config/data/sysmgr/`,
which are [formatted as either an app or service](/src/sys/sysmgr/sysmgr-configuration.md).
The table of which components implement which services is contained in the
[services.config](/src/sys/sysmgr/config/services.config) file.
# Layer 3: [basemgr](/src/modular/bin/basemgr/)
`basemgr`'s job is to setup the interactive flow for user login and user
management.
It first gets access to the root view of the system, starts up Device Shell and
draws the Device Shell UI in the root view starting the interactive flow. It also
manages a user database that is exposed to Device Shell via the User Provider
FIDL API.
This API allows the Device Shell to add a new user, delete an existing user,
enumerate all existing users and login as an existing user or in incognito mode.
Adding a new user is done using an Account Manager service that can talk to an
identity provider to get an id token to access the user's Ledger.
Logging-in as an existing user starts an instance of `sessionmgr` with that
user's id token and with a namespace that is mapped within and managed by
`basemgr`'s namespace.
Logging-in as a guest user (in incognito mode) starts an instance of
`sessionmgr` but without an id token and a temporary namespace.