支持syscall快速系统调用指令 (#417)

* 支持syscall快速系统调用指令

---------

Co-authored-by: LoGin <longjin@DragonOS.org>
This commit is contained in:
GnoCiYeH
2023-11-04 21:39:44 +08:00
committed by GitHub
parent 2f6f547ae0
commit 1603395155
14 changed files with 317 additions and 48 deletions

View File

@ -339,7 +339,9 @@ impl ProcessManager {
// TODO: 克隆前应该锁信号处理,等待克隆完成后再处理
// 克隆架构相关
*pcb.arch_info() = current_pcb.arch_info_irqsave().clone();
let guard = current_pcb.arch_info_irqsave();
pcb.arch_info().clone_from(&guard);
drop(guard);
// 为内核线程设置WorkerPrivate
if current_pcb.flags().contains(ProcessFlags::KTHREAD) {

View File

@ -510,6 +510,9 @@ pub struct ProcessControlBlock {
/// 进程的内核栈
kernel_stack: RwLock<KernelStack>,
/// 系统调用栈
syscall_stack: RwLock<KernelStack>,
/// 与调度相关的信息
sched_info: RwLock<ProcessSchedulerInfo>,
/// 与处理器架构相关的信息
@ -571,7 +574,7 @@ impl ProcessControlBlock {
let flags = SpinLock::new(ProcessFlags::empty());
let sched_info = ProcessSchedulerInfo::new(None);
let arch_info = SpinLock::new(ArchPCBInfo::new(Some(&kstack)));
let arch_info = SpinLock::new(ArchPCBInfo::new(&kstack));
let ppcb: Weak<ProcessControlBlock> = ProcessManager::find(ppid)
.map(|p| Arc::downgrade(&p))
@ -583,6 +586,7 @@ impl ProcessControlBlock {
preempt_count,
flags,
kernel_stack: RwLock::new(kstack),
syscall_stack: RwLock::new(KernelStack::new().unwrap()),
worker_private: SpinLock::new(None),
sched_info,
arch_info,
@ -594,11 +598,21 @@ impl ProcessControlBlock {
thread: RwLock::new(ThreadInfo::new()),
};
// 初始化系统调用栈
pcb.arch_info
.lock()
.init_syscall_stack(&pcb.syscall_stack.read());
let pcb = Arc::new(pcb);
// 设置进程的arc指针到内核栈的最低地址处
// 设置进程的arc指针到内核栈和系统调用栈的最低地址处
unsafe {
pcb.kernel_stack
.write()
.set_pcb(Arc::downgrade(&pcb))
.unwrap();
pcb.syscall_stack
.write()
.set_pcb(Arc::downgrade(&pcb))
.unwrap()
@ -788,6 +802,16 @@ impl ProcessControlBlock {
self.sig_info.read()
}
pub fn try_siginfo(&self, times: u8) -> Option<RwLockReadGuard<ProcessSignalInfo>> {
for _ in 0..times {
if let Some(r) = self.sig_info.try_read() {
return Some(r);
}
}
return None;
}
pub fn sig_info_mut(&self) -> RwLockWriteGuard<ProcessSignalInfo> {
self.sig_info.write()
}
@ -1026,7 +1050,7 @@ impl ProcessSchedulerInfo {
}
}
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct KernelStack {
stack: Option<AlignedBox<[u8; KernelStack::SIZE], { KernelStack::ALIGN }>>,
/// 标记该内核栈是否可以被释放