Struct Sel4Task

Source
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

Source

pub fn fd_open( &self, dirfd: isize, path: *const u8, flags: OpenFlags, ) -> VfsResult<File>

根据 dir_fd 打开一个文件

§参数
  • fd 打开文件所在的文件夹
  • path 需要打开的文件的路径
  • flags 打开文件使用的标志
Source

pub fn fd_resolve(&self, dirfd: isize, path: *const u8) -> VfsResult<PathBuf>

根据 dir_fd 解析一个文件的真实路径

§参数
  • fd 文件所在的文件夹
  • path 文件路径
Source§

impl Sel4Task

Source

pub fn init_stack(&self) -> usize

初始化用户栈,传递参数(args),环境变量(env)和辅助向量(auxv)

需要传递的栈,环境变量和辅助向量需要提前填充到 Sel4Task::info

Source

pub fn init_tcb(&self) -> Result<(), Error>

初始化 sel4::cap::Tcb 信息

初始化 tcb 信息,设置调度优先级,目前设定为固定值 TODO: 更改调度优先级的设置,更加灵活自由

Source§

impl Sel4Task

Source

pub fn brk(&self, value: usize) -> usize

进行 brk 操作

  • value 是需要调整的堆地址
§说明

如果 value 的值为 0,则返回当前的堆地址,否则就将堆扩展到指定的地址

Source

pub fn read_ins(&self, vaddr: usize) -> Option<u32>

在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取特定地址的指令

  • vaddr 是需要读取指令的虚拟地址

说明:

  • 如果地址空间不存在或者地址未映射,返回 [Option::None]
Source

pub fn read_bytes(&self, vaddr: usize, len: usize) -> Option<Vec<u8>>

在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取特定地址的数据

  • vaddr 是需要读取数据的虚拟地址
  • len 是需要读取的数据长度

说明:

  • 如果地址空间不存在或者地址未映射,返回 [Option::None]
Source

pub fn read_cstr(&self, vaddr: usize) -> Option<Vec<u8>>

在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取 C 语言的字符串信息,直到遇到 \0

  • vaddr 是需要读取数据的虚拟地址

说明:

  • 如果地址空间不存在或者地址未映射,返回 [Option::None]
Source

pub fn read_vec(&self, vaddr: usize) -> Option<Vec<usize>>

在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下读取 C 语言的字符串信息,直到遇到 \0

  • vaddr 是需要读取数据的虚拟地址

说明:

  • 如果地址空间不存在或者地址未映射,返回 [Option::None]
Source

pub fn write_bytes(&self, vaddr: usize, data: &[u8]) -> Option<()>

在当前任务 Sel4Task 的地址空间 Sel4Task::vspace 下写入数据到特定地址

  • vaddr 是需要写入数据的虚拟地址
  • data 是需要写入的数据

说明:

  • 如果地址空间不存在或者地址未映射,返回 [Option::None] TODO: 在写入之前检测所有的地址是否可以写入
Source

pub fn check_addr(&self, vaddr: usize, size: usize)

检测地址是否在栈上,如果在栈上且没有映射内存,那么直接映射内存

§参数
  • vaddr 需要检测内存的开始
  • size 需要检测内存的大小
Source

pub fn clear_maped(&self)

清理映射的内存

如果有已经映射的内存, 清理

Source§

impl Sel4Task

Source

pub fn check_signal(&self, ctx: &mut UserContext)

检查当前任务是否有信号待处理

§说明

当前任务的上下文在检测到信号待处理的时候会进程存储

Source

pub fn add_signal(&self, signal: SignalNum, from: usize)

添加信号

§参数
  • signal 为当前 Sel4Task 添加的信号
  • from 从哪个线程发送的
§说明

添加信号可能会打断某些行为

Source

pub fn pop_signal(&self) -> Option<SignalNum>

弹出一个待处理的信号

Source

pub fn has_unmasked_signal(&self) -> bool

检查当前任务是否有未屏蔽的信号待处理

Source

pub fn write_ucontext(&self, ctx: &UserContext, mask: SigSet) -> usize

UserContext 写入栈

Source

pub fn read_ucontext(&self, ctx: &mut UserContext)

从当前栈中读取 sig

Source§

impl Sel4Task

Source

pub fn new() -> Result<Self, Error>

创建一个新的任务

Source

pub fn create_thread(&self) -> Result<Self, Error>

创建一个新的线程

Source

pub fn find_free_area(&self, start: usize, size: usize) -> usize

在当前任务的地址空间中找到最大可用的虚拟地址

  • start 从哪块内存开始
  • size 需要查找的内存块大小
Source

pub fn map_page(&self, vaddr: usize, page: PhysPage)

映射一个物理页到虚拟地址空间

  • vaddr 需要映射的虚拟地址,需要对齐到 4k 页
  • page 需要映射的物理页,是一个 Capability
Source

pub fn unmap_page(&mut self, vaddr: usize)

取消映射一个地址的物理页

  • vaddr 需要取消映射的虚拟地址,需要对齐到 4k 页
Source

pub fn map_blank_page(&self, vaddr: usize) -> PhysPage

映射一个空白页到虚拟地址空间

§参数
  • vaddr 需要映射的虚拟地址,计算时会向下 4K 对齐
Source

pub fn map_region(&self, start: usize, end: usize)

映射一个区域的内存

  • start 是起始地址
  • end 是结束地址

说明: 地址需要对齐到 0x1000

Source

pub fn load_elf(&self, file: &File<'_>)

加载一个 elf 文件到当前任务的地址空间

  • elf_data 是 elf 文件的数据
Source

pub fn exit_with(&self, code: u32)

退出当前任务

§参数
  • code 退出使用的 code

Trait Implementations§

Source§

impl Drop for Sel4Task

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

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 T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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 T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts 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 T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts 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>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UpcastIntoPayload for T
where T: Any + Send + 'static,