Boot
In this section, we explain how Awkernel boots.
x86_64
Primary Core
The primary core calls kernel_main of x86_64 first, which
is called by UEFI.
kernel_main:kernel/src/arch/x86_64/kernel_main.rskernel_main2:kernel/src/arch/x86_64/kernel_main.rsmain:kernel/src/main.rs
graph TD;
kernel_main:kernel_main.rs-->kernel_main2:kernel_main.rs;
kernel_main2:kernel_main.rs-->main:main.rs;
During the primary core is booting, it wakes up non-primary cores by sending ACPI's IPIs.
Non-primary Cores
Non-primary cores calls _start_cpu defined in mpboot.S first, and it then calls non_primary_kernel_main.
It eventually calls main like the primary core.
_start_cpu:kernel/asm/x86/mpboot.Snon_primary_kernel_main:kernel/src/arch/x86_64/kernel_main.rsmain:kernel/src/main.rs
graph TD;
_start_cpu:mpboot.S-->non_primary_kernel_main:kernel_main.rs;
non_primary_kernel_main:kernel_main.rs-->main:main.rs;
AArch64
Primary and Non-primary Cores
_start defined in boot.S is the entry point for both the primary and non-primary cores.
_start eventually calls kernel_main in kernel_main.rs.
After that, the primary core calls primary_cpu and non-primary cores call non_primary_cpu.
Eventually, main is called.
_start:kernel/asm/aarch64/boot.Skernel_main:kernel/src/arch/aarch64/kernel_main.rs- The primary core calls
primary_cpuand non-primary cores callnon_primary_cpu. main:kernel/src/main.rs
graph TD;
_start:boot.S-->kernel_main:kernel_main.rs;
kernel_main:kernel_main.rs-->primary_cpu:kernel_main.rs;
kernel_main:kernel_main.rs-->non_primary_cpu:kernel_main.rs;
primary_cpu:kernel_main.rs-->main:main.rs;
non_primary_cpu:kernel_main.rs-->main:main.rs;
Main Function
After booting, in the main function, the primary core wakes async/await tasks,
and non-primary cores execute async/await tasks.
Primary Core
In main function, the primary core periodically calls
wake_task and poll functions defined in
awkernel_async_lib and awkernel_lib,
graph TD;
main:kernel/src/main.rs-->wake_task:awkernel_async_lib/src/scheduler.rs;
main:kernel/src/main.rs-->poll:awkernel_lib/src/net.rs;
wake_task is a function to wake sleeping async/await tasks up,
and it will be explained in Sec. Scheduler.
poll is a function to poll network interface controllers.
If some events arrives, poll wakes async/await tasks related to
the controllers.
Non-primary Cores
In main function, non-primary core periodically call
run defined in awkernel_async_lib.
run initializes variables regarding preemption by calling preempt::init.
After that, it calls run_main to execute async/await tasks.
main:kernel/src/main.rsrun:awkernel_async_lib/src/task.rsinit:awkernel_async_lib/src/task/preempt.rsrun_main:awkernel_async_lib/src/task.rs
graph TD;
main:kernel/src/main.rs-->run:awkernel_async_lib/src/task.rs;
run:awkernel_async_lib/src/task.rs-->init:awkernel_async_lib/src/task/preempt.rs;
run:awkernel_async_lib/src/task.rs-->run_main:awkernel_async_lib/src/task.rs;
run_main executes async/await tasks,
and it will be explained in Sec. Scheduler.