SimpleKernel 1.17.0
Loading...
Searching...
No Matches
TaskControlBlock Struct Reference

任务控制块,管理进程/线程的核心数据结构 More...

#include <task_control_block.hpp>

Inheritance diagram for TaskControlBlock:
Inheritance graph
Collaboration diagram for TaskControlBlock:
Collaboration graph

Classes

struct  PriorityCompare
 任务优先级比较函数,优先级数值越小,优先级越高 More...
 
union  SchedData
 不同调度器的专用字段 (互斥使用) More...
 
struct  SchedInfo
 基础调度信息 More...
 
struct  WakeTickCompare
 任务唤醒时间比较函数,时间越早优先级越高 More...
 

Public Member Functions

auto GetStatus () const -> etl::fsm_state_id_t
 获取当前任务状态
 
auto IsThreadGroupLeader () const -> bool
 检查是否是线程组的主线程
 
auto JoinThreadGroup (TaskControlBlock *leader) -> void
 将线程添加到线程组
 
auto LeaveThreadGroup () -> void
 从线程组中移除自己
 
auto GetThreadGroupSize () const -> size_t
 获取线程组中的线程数量
 
auto InSameThreadGroup (const TaskControlBlock *other) const -> bool
 检查是否与另一个任务在同一线程组
 
构造/析构函数
 TaskControlBlock (const char *name, int priority, ThreadEntry entry, void *arg)
 构造函数 (内核线程)
 
 TaskControlBlock (const char *name, int priority, uint8_t *elf, int argc, char **argv)
 构造函数 (用户线程)
 
 TaskControlBlock ()=default
 
 TaskControlBlock (const TaskControlBlock &)=delete
 
 TaskControlBlock (TaskControlBlock &&)=delete
 
auto operator= (const TaskControlBlock &) -> TaskControlBlock &=delete
 
auto operator= (TaskControlBlock &&) -> TaskControlBlock &=delete
 
 ~TaskControlBlock ()
 

Public Attributes

const char * name {"Unnamed Task"}
 任务名称
 
Pid pid {0}
 线程 ID (Task ID)
 
TaskFsm fsm {}
 任务状态机
 
SchedPolicy policy {SchedPolicy::kNormal}
 调度策略
 
struct TaskControlBlock::SchedInfo sched_info
 
union TaskControlBlock::SchedData sched_data
 
uint8_t * kernel_stack {nullptr}
 内核栈
 
cpu_io::TrapContexttrap_context_ptr {nullptr}
 Trap 上下文
 
cpu_io::CalleeSavedContext task_context {}
 任务上下文
 
uint64_t * page_table {nullptr}
 页表
 
TaskAuxDataaux {nullptr}
 非调度热路径的辅助数据
 

Static Public Attributes

static constexpr size_t kDefaultKernelStackSize = 16 * 1024
 默认内核栈大小 (16 KB)
 

Detailed Description

任务控制块,管理进程/线程的核心数据结构

仅保留调度热路径字段(状态机、优先级、上下文、页表等)。 进程级辅助数据存储在 TaskAuxData 中,通过 aux 指针访问。

Definition at line 121 of file task_control_block.hpp.

Constructor & Destructor Documentation

◆ TaskControlBlock() [1/5]

TaskControlBlock::TaskControlBlock ( const char *  name,
int  priority,
ThreadEntry  entry,
void *  arg 
)

构造函数 (内核线程)

Parameters
name任务名称
priority优先级 (数字越小优先级越高)
entry线程入口函数
arg线程参数

Definition at line 131 of file task_control_block.cpp.

133 : name(_name) {
134 // 分配辅助数据
135 aux = new TaskAuxData{};
136 if (!aux) {
137 klog::Err("Failed to allocate TaskAuxData for task {}", name);
138 return;
139 }
140
141 // 设置优先级
142 sched_info.priority = priority;
143 sched_info.base_priority = priority;
144
145 // 分配内核栈
146 kernel_stack = static_cast<uint8_t*>(aligned_alloc(
148 if (!kernel_stack) {
149 klog::Err("Failed to allocate kernel stack for task {}", name);
150 return;
151 }
152
153 // 设置 trap_context_ptr 指向内核栈顶预留的位置
154 trap_context_ptr = reinterpret_cast<cpu_io::TrapContext*>(
156
157 // 设置内核栈顶
158 auto stack_top =
159 reinterpret_cast<uint64_t>(kernel_stack) + kDefaultKernelStackSize;
160
161 // 初始化任务上下文
162 InitTaskContext(&task_context, entry, arg, stack_top);
163
164 fsm.Start();
165}
auto InitTaskContext(cpu_io::CalleeSavedContext *task_context, void(*entry)(void *), void *arg, uint64_t stack_top) -> void
初始化内核线程的任务上下文(重载1)
Definition arch_main.cpp:77
auto Start() -> void
启动 FSM(在 TCB 完全构造后调用)
Definition task_fsm.hpp:157
static constexpr size_t kPageSize
Definition cpu_io.h:63
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
void * aligned_alloc(size_t alignment, size_t size)
Definition memory.cpp:58
非调度热路径的任务辅助数据
int priority
优先级 (数字越小优先级越高)
int base_priority
基础优先级 (静态,用于优先级继承)
struct TaskControlBlock::SchedInfo sched_info
TaskFsm fsm
任务状态机
TaskAuxData * aux
非调度热路径的辅助数据
uint8_t * kernel_stack
内核栈
cpu_io::CalleeSavedContext task_context
任务上下文
static constexpr size_t kDefaultKernelStackSize
默认内核栈大小 (16 KB)
cpu_io::TrapContext * trap_context_ptr
Trap 上下文
const char * name
任务名称
Here is the call graph for this function:

◆ TaskControlBlock() [2/5]

TaskControlBlock::TaskControlBlock ( const char *  name,
int  priority,
uint8_t *  elf,
int  argc,
char **  argv 
)

构造函数 (用户线程)

Parameters
name任务名称
priority优先级 (数字越小优先级越高)
elf指向 ELF 镜像的指针
argc参数个数
argv参数数组
Todo:

Definition at line 167 of file task_control_block.cpp.

169 : name(_name) {
170 // 分配辅助数据
171 aux = new TaskAuxData{};
172 if (!aux) {
173 klog::Err("Failed to allocate TaskAuxData for task {}", name);
174 return;
175 }
176
177 // 设置优先级
178 sched_info.priority = priority;
179 sched_info.base_priority = priority;
180
182 (void)_name;
183 (void)priority;
184 (void)elf;
185 (void)argc;
186 (void)argv;
187 LoadElf(nullptr, nullptr);
188
189 fsm.Start();
190}
Here is the call graph for this function:

◆ TaskControlBlock() [3/5]

TaskControlBlock::TaskControlBlock ( )
default

◆ TaskControlBlock() [4/5]

TaskControlBlock::TaskControlBlock ( const TaskControlBlock )
delete

◆ TaskControlBlock() [5/5]

TaskControlBlock::TaskControlBlock ( TaskControlBlock &&  )
delete

◆ ~TaskControlBlock()

TaskControlBlock::~TaskControlBlock ( )

Definition at line 192 of file task_control_block.cpp.

192 {
193 // 从线程组中移除
195
196 // 释放内核栈
197 if (kernel_stack) {
199 kernel_stack = nullptr;
200 }
201
202 // 释放页表(如果有用户空间页表)
203 if (page_table) {
204 // 如果是私有页表(非共享),需要释放物理页
205 auto should_free_pages = !(aux->clone_flags & clone_flag::kVm);
206 VirtualMemorySingleton::instance().DestroyPageDirectory(page_table,
207 should_free_pages);
208 page_table = nullptr;
209 }
210
211 // 释放辅助数据
212 if (aux) {
213 delete aux;
214 aux = nullptr;
215 }
216}
constexpr uint64_t kVm
共享地址空间
void aligned_free(void *ptr)
Definition memory.cpp:65
CloneFlags clone_flags
克隆标志位
auto LeaveThreadGroup() -> void
从线程组中移除自己
uint64_t * page_table
页表
Here is the call graph for this function:

Member Function Documentation

◆ GetStatus()

auto TaskControlBlock::GetStatus ( ) const -> etl::fsm_state_id_t

获取当前任务状态

Returns
etl::fsm_state_id_t 当前任务状态 ID

Definition at line 88 of file task_control_block.cpp.

88 {
89 return fsm.GetStateId();
90}
auto GetStateId() const -> etl::fsm_state_id_t
获取当前状态 ID
Definition task_fsm.hpp:169
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetThreadGroupSize()

auto TaskControlBlock::GetThreadGroupSize ( ) const -> size_t

获取线程组中的线程数量

Returns
size_t 线程数量 (包括自己)

Definition at line 106 of file task_control_block.cpp.

106 {
107 if (aux->tgid == 0) {
108 // 未加入任何线程组
109 return 1;
110 }
111
112 size_t count = 1;
113
114 // 向前遍历至链表头
115 const ThreadGroupLink* curr = etl_previous;
116 while (curr) {
117 ++count;
118 curr = curr->etl_previous;
119 }
120
121 // 向后遍历至链表尾
122 curr = etl_next;
123 while (curr) {
124 ++count;
125 curr = curr->etl_next;
126 }
127
128 return count;
129}
Pid tgid
线程组 ID (主线程的 PID)
etl::bidirectional_link< 0 > ThreadGroupLink
线程组侵入式链表节点类型

◆ InSameThreadGroup()

auto TaskControlBlock::InSameThreadGroup ( const TaskControlBlock other) const -> bool
inline

检查是否与另一个任务在同一线程组

Parameters
other另一个任务
Returns
true 如果在同一线程组

Definition at line 259 of file task_control_block.hpp.

260 {
261 return aux && other && other->aux && (aux->tgid == other->aux->tgid) &&
262 (aux->tgid != 0);
263 }

◆ IsThreadGroupLeader()

auto TaskControlBlock::IsThreadGroupLeader ( ) const -> bool
inline

检查是否是线程组的主线程

Returns
true 如果是主线程 (pid == tgid)

Definition at line 231 of file task_control_block.hpp.

231 {
232 return aux && pid == aux->tgid;
233 }
Pid pid
线程 ID (Task ID)

◆ JoinThreadGroup()

auto TaskControlBlock::JoinThreadGroup ( TaskControlBlock leader) -> void

将线程添加到线程组

Parameters
leader线程组的主线程
Note
调用者需要确保加锁

Definition at line 92 of file task_control_block.cpp.

92 {
93 if (!leader || leader == this) {
94 return;
95 }
96
97 // 设置 tgid
98 aux->tgid = leader->aux->tgid;
99
100 // 在 leader 之后插入自身
101 etl::link_splice<ThreadGroupLink>(*leader, *this);
102}

◆ LeaveThreadGroup()

auto TaskControlBlock::LeaveThreadGroup ( ) -> void

从线程组中移除自己

Note
调用者需要确保加锁

Definition at line 104 of file task_control_block.cpp.

104{ ThreadGroupLink::unlink(); }
Here is the caller graph for this function:

◆ operator=() [1/2]

auto TaskControlBlock::operator= ( const TaskControlBlock ) -> TaskControlBlock &=delete
delete

◆ operator=() [2/2]

auto TaskControlBlock::operator= ( TaskControlBlock &&  ) -> TaskControlBlock &=delete
delete

Member Data Documentation

◆ aux

TaskAuxData* TaskControlBlock::aux {nullptr}

非调度热路径的辅助数据

Definition at line 219 of file task_control_block.hpp.

219{nullptr};

◆ fsm

TaskFsm TaskControlBlock::fsm {}

任务状态机

Definition at line 162 of file task_control_block.hpp.

162{};

◆ kDefaultKernelStackSize

constexpr size_t TaskControlBlock::kDefaultKernelStackSize = 16 * 1024
staticconstexpr

默认内核栈大小 (16 KB)

Definition at line 123 of file task_control_block.hpp.

◆ kernel_stack

uint8_t* TaskControlBlock::kernel_stack {nullptr}

内核栈

Definition at line 209 of file task_control_block.hpp.

209{nullptr};

◆ name

const char* TaskControlBlock::name {"Unnamed Task"}

任务名称

Definition at line 156 of file task_control_block.hpp.

156{"Unnamed Task"};

◆ page_table

uint64_t* TaskControlBlock::page_table {nullptr}

页表

Definition at line 216 of file task_control_block.hpp.

216{nullptr};

◆ pid

Pid TaskControlBlock::pid {0}

线程 ID (Task ID)

Definition at line 159 of file task_control_block.hpp.

159{0};

◆ policy

SchedPolicy TaskControlBlock::policy {SchedPolicy::kNormal}

调度策略

Definition at line 165 of file task_control_block.hpp.

@ kNormal
普通任务

◆ sched_data

union TaskControlBlock::SchedData TaskControlBlock::sched_data

◆ sched_info

struct TaskControlBlock::SchedInfo TaskControlBlock::sched_info

◆ task_context

cpu_io::CalleeSavedContext TaskControlBlock::task_context {}

任务上下文

Definition at line 214 of file task_control_block.hpp.

214{};

◆ trap_context_ptr

cpu_io::TrapContext* TaskControlBlock::trap_context_ptr {nullptr}

Trap 上下文

Definition at line 212 of file task_control_block.hpp.

212{nullptr};

The documentation for this struct was generated from the following files: