pub struct Sel4Task {Show 19 fields
pub pid: usize,
pub ppid: usize,
pub pgid: usize,
pub tid: usize,
pub capset: Arc<Mutex<CapMemSet>>,
pub tcb: Tcb,
pub cnode: CNode,
pub vspace: VSpace,
pub mem: Arc<Mutex<TaskMemInfo>>,
pub shm: Arc<Mutex<Vec<Arc<MapedSharedMemory>>>>,
pub exit: Mutex<Option<u32>>,
pub futex_table: Arc<Mutex<Vec<(usize, usize, Waker, Arc<Mutex<Result<usize, Errno>>>)>>>,
pub signal: Mutex<TaskSignal>,
pub clear_child_tid: Mutex<usize>,
pub file: TaskFileInfo,
pub info: Mutex<TaskInfo>,
pub thread_counter: Mutex<Option<Arc<()>>>,
pub pcb: Arc<ProcessControlBlock>,
pub waker: Mutex<Option<(PollWakeEvent, Waker)>>,
}
Expand description
Sel4Task 结构体
Fields§
§pid: usize
进程 ID
ppid: usize
父进程 ID
pgid: usize
进程组 ID
tid: usize
任务 ID (线程 ID)
capset: Arc<Mutex<CapMemSet>>
资源内存分配器
tcb: Tcb
进程控制块(Capability)
cnode: CNode
能力空间入口 (CSpace Root)
vspace: VSpace
地址空间 (Capability)
mem: Arc<Mutex<TaskMemInfo>>
任务内存映射信息
shm: Arc<Mutex<Vec<Arc<MapedSharedMemory>>>>
共享内存信息
exit: Mutex<Option<u32>>
退出状态码
futex_table: Arc<Mutex<Vec<(usize, usize, Waker, Arc<Mutex<Result<usize, Errno>>>)>>>
Futex 表
signal: Mutex<TaskSignal>
信号信息
clear_child_tid: Mutex<usize>
The clear thread tid field
See https://manpages.debian.org/unstable/manpages-dev/set_tid_address.2.en.html#clear_child_tid
When the thread exits, the kernel clears the word at this address if it is not NULL.
file: TaskFileInfo
任务相关文件信息。
info: Mutex<TaskInfo>
任务初始信息,任务的初始信息记录在这里,方便进行初始化
thread_counter: Mutex<Option<Arc<()>>>
资源计数器,用于跟踪线程数量
pcb: Arc<ProcessControlBlock>
进程控制块
waker: Mutex<Option<(PollWakeEvent, Waker)>>
异步 await 时存储的结构
Implementations§
Source§impl Sel4Task
impl Sel4Task
Sourcepub fn init_stack(&self) -> usize
pub fn init_stack(&self) -> usize
初始化用户栈,传递参数(args),环境变量(env)和辅助向量(auxv)
需要传递的栈,环境变量和辅助向量需要提前填充到 Sel4Task::info 下
Sourcepub fn init_tcb(&self) -> Result<(), Error>
pub fn init_tcb(&self) -> Result<(), Error>
初始化 sel4::cap::Tcb 信息
初始化 tcb 信息,设置调度优先级,目前设定为固定值 TODO: 更改调度优先级的设置,更加灵活自由
Source§impl Sel4Task
impl Sel4Task
Sourcepub fn read_ins(&self, vaddr: usize) -> Option<u32>
pub fn read_ins(&self, vaddr: usize) -> Option<u32>
在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取特定地址的指令
vaddr
是需要读取指令的虚拟地址
说明:
- 如果地址空间不存在或者地址未映射,返回 [Option::None]
Sourcepub fn read_bytes(&self, vaddr: usize, len: usize) -> Option<Vec<u8>>
pub fn read_bytes(&self, vaddr: usize, len: usize) -> Option<Vec<u8>>
在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取特定地址的数据
vaddr
是需要读取数据的虚拟地址len
是需要读取的数据长度
说明:
- 如果地址空间不存在或者地址未映射,返回 [Option::None]
Sourcepub fn read_cstr(&self, vaddr: usize) -> Option<Vec<u8>>
pub fn read_cstr(&self, vaddr: usize) -> Option<Vec<u8>>
在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取 C 语言的字符串信息,直到遇到 \0
vaddr
是需要读取数据的虚拟地址
说明:
- 如果地址空间不存在或者地址未映射,返回 [Option::None]
Sourcepub fn read_vec(&self, vaddr: usize) -> Option<Vec<usize>>
pub fn read_vec(&self, vaddr: usize) -> Option<Vec<usize>>
在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取 C 语言的字符串信息,直到遇到 \0
vaddr
是需要读取数据的虚拟地址
说明:
- 如果地址空间不存在或者地址未映射,返回 [Option::None]
Sourcepub fn write_bytes(&self, vaddr: usize, data: &[u8]) -> Option<()>
pub fn write_bytes(&self, vaddr: usize, data: &[u8]) -> Option<()>
在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下写入数据到特定地址
vaddr
是需要写入数据的虚拟地址data
是需要写入的数据
说明:
- 如果地址空间不存在或者地址未映射,返回 [Option::None] TODO: 在写入之前检测所有的地址是否可以写入
Sourcepub fn check_addr(&self, vaddr: usize, size: usize)
pub fn check_addr(&self, vaddr: usize, size: usize)
Sourcepub fn clear_maped(&self)
pub fn clear_maped(&self)
清理映射的内存
如果有已经映射的内存, 清理
Source§impl Sel4Task
impl Sel4Task
Sourcepub fn check_signal(&self, ctx: &mut UserContext)
pub fn check_signal(&self, ctx: &mut UserContext)
Sourcepub fn add_signal(&self, signal: SignalNum, from: usize)
pub fn add_signal(&self, signal: SignalNum, from: usize)
Sourcepub fn pop_signal(&self) -> Option<SignalNum>
pub fn pop_signal(&self) -> Option<SignalNum>
弹出一个待处理的信号
Sourcepub fn has_unmasked_signal(&self) -> bool
pub fn has_unmasked_signal(&self) -> bool
检查当前任务是否有未屏蔽的信号待处理
Sourcepub fn write_ucontext(&self, ctx: &UserContext, mask: SigSet) -> usize
pub fn write_ucontext(&self, ctx: &UserContext, mask: SigSet) -> usize
将 UserContext 写入栈
Sourcepub fn read_ucontext(&self, ctx: &mut UserContext)
pub fn read_ucontext(&self, ctx: &mut UserContext)
从当前栈中读取 sig
Source§impl Sel4Task
impl Sel4Task
Sourcepub fn create_thread(&self) -> Result<Self, Error>
pub fn create_thread(&self) -> Result<Self, Error>
创建一个新的线程
Sourcepub fn find_free_area(&self, start: usize, size: usize) -> usize
pub fn find_free_area(&self, start: usize, size: usize) -> usize
在当前任务的地址空间中找到最大可用的虚拟地址
start
从哪块内存开始size
需要查找的内存块大小
Sourcepub fn map_page(&self, vaddr: usize, page: PhysPage)
pub fn map_page(&self, vaddr: usize, page: PhysPage)
映射一个物理页到虚拟地址空间
vaddr
需要映射的虚拟地址,需要对齐到 4k 页page
需要映射的物理页,是一个 Capability
Sourcepub fn unmap_page(&mut self, vaddr: usize)
pub fn unmap_page(&mut self, vaddr: usize)
取消映射一个地址的物理页
vaddr
需要取消映射的虚拟地址,需要对齐到 4k 页
Sourcepub fn map_blank_page(&self, vaddr: usize) -> PhysPage
pub fn map_blank_page(&self, vaddr: usize) -> PhysPage
Sourcepub fn map_region(&self, start: usize, end: usize)
pub fn map_region(&self, start: usize, end: usize)
映射一个区域的内存
start
是起始地址end
是结束地址
说明: 地址需要对齐到 0x1000
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Sel4Task
impl !RefUnwindSafe for Sel4Task
impl Send for Sel4Task
impl Sync for Sel4Task
impl Unpin for Sel4Task
impl !UnwindSafe for Sel4Task
Blanket Implementations§
§impl<T> Any for Twhere
T: 'static + ?Sized,
impl<T> Any for Twhere
T: 'static + ?Sized,
§impl<T> Borrow<T> for Twhere
T: ?Sized,
impl<T> Borrow<T> for Twhere
T: ?Sized,
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for Twhere
T: Any + Send,
impl<T> DowncastSend for Twhere
T: Any + Send,
Source§fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>
fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>
Box<Trait>
(where Trait: DowncastSend
) to Box<dyn Any + Send>
, which
can then be downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§impl<T> DowncastSync for Twhere
T: Any + Send + Sync,
impl<T> DowncastSync for Twhere
T: Any + Send + Sync,
Source§fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>
fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>
Box<Trait>
(where Trait: DowncastSync
) to Box<dyn Any + Send + Sync>
,
which can then be downcast
into Box<ConcreteType>
where ConcreteType
implements
Trait
.Source§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
Arc<Trait>
(where Trait: DowncastSync
) to Arc<Any>
, which can then be
downcast
into Arc<ConcreteType>
where ConcreteType
implements Trait
.