Expand description
Task management implementation
Everything about task management, like starting and switching tasks is implemented here.
A single global instance of TaskManager
called TASK_MANAGER
controls
all the tasks in the whole operating system.
A single global instance of Processor
called PROCESSOR
monitors running
task(s) for each core.
A single global instance of PidAllocator
called PID_ALLOCATOR
allocates
pid for user apps.
Be careful when you see __switch
ASM function in switch.S
. Control flow around this function
might not be what you expect.
Modules
- context 🔒Implementation of
TaskContext
- manager 🔒Implementation of
TaskManager
- pid 🔒Implementation of
PidAllocator
- Implementation of
Processor
and Intersection of control flow - switch 🔒Wrap
switch.S
as a function - task 🔒Implementation of
TaskControlBlock
Structs
- Globle process that init user shell
- Kernelstack for app
- Pid Allocator struct
- Bind pid lifetime to
PidHandle
- Processor management structure
- task context structure containing some registers
- A array of
TaskControlBlock
that is thread-safe
Constants
- pid of usertests app in make run TEST=1
Functions
- Add init process to the manager
- Interface offered to add task
- Get running task
- Get the mutable reference to trap context of current task
- Get token of the address space of current task
- Exit the current ‘Running’ task and run the next task in task list.
- Interface offered to pop the first task
- Allocate a pid from PID_ALLOCATOR
- The main part of process execution and scheduling Loop
fetch_task
to get the process that needs to run, and switch the process through__switch
- Return to idle control flow for new scheduling
- Suspend the current ‘Running’ task and run the next task in task list.
- Take the current task,leaving a None in its place