mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-23 03:53:26 +00:00
支持syscall快速系统调用指令 (#417)
* 支持syscall快速系统调用指令 --------- Co-authored-by: LoGin <longjin@DragonOS.org>
This commit is contained in:
@ -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) {
|
||||
|
@ -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 }>>,
|
||||
/// 标记该内核栈是否可以被释放
|
||||
|
Reference in New Issue
Block a user