添加thread和futex机制 (#411)

* 初步实现clone系统调用

* 实现了线程,初步实现futex机制,添加了几个小的系统调用

* 更改pcb引用计数问题

* 解决死锁bug

---------

Co-authored-by: LoGin <longjin@DragonOS.org>
This commit is contained in:
GnoCiYeH
2023-11-01 20:55:57 +08:00
committed by GitHub
parent 665f4a7707
commit 971462be94
25 changed files with 1643 additions and 149 deletions

View File

@ -706,7 +706,7 @@ impl UserMappings {
/// 请注意在调用本函数之前必须先确定region所在范围内没有VMA。
fn reserve_hole(&mut self, region: &VirtRegion) {
let prev_hole: Option<(&VirtAddr, &mut usize)> =
self.vm_holes.range_mut(..region.start()).next_back();
self.vm_holes.range_mut(..=region.start()).next_back();
if let Some((prev_hole_vaddr, prev_hole_size)) = prev_hole {
let prev_hole_end = prev_hole_vaddr.add(*prev_hole_size);
@ -946,6 +946,8 @@ pub struct VMA {
/// VMA所属的用户地址空间
user_address_space: Option<Weak<AddressSpace>>,
self_ref: Weak<LockedVMA>,
provider: Provider,
}
impl core::hash::Hash for VMA {
@ -956,6 +958,12 @@ impl core::hash::Hash for VMA {
}
}
/// 描述不同类型的内存提供者或资源
#[derive(Debug)]
pub enum Provider {
Allocated, // TODO:其他
}
#[allow(dead_code)]
impl VMA {
pub fn region(&self) -> &VirtRegion {
@ -974,6 +982,7 @@ impl VMA {
mapped: self.mapped,
user_address_space: self.user_address_space.clone(),
self_ref: self.self_ref.clone(),
provider: Provider::Allocated,
};
}
@ -1019,8 +1028,15 @@ impl VMA {
///
/// - `prot_flags` 要检查的标志位
pub fn can_have_flags(&self, prot_flags: ProtFlags) -> bool {
return (self.flags.has_write() || !prot_flags.contains(ProtFlags::PROT_WRITE))
let is_downgrade = (self.flags.has_write() || !prot_flags.contains(ProtFlags::PROT_WRITE))
&& (self.flags.has_execute() || !prot_flags.contains(ProtFlags::PROT_EXEC));
match self.provider {
Provider::Allocated { .. } => true,
#[allow(unreachable_patterns)]
_ => is_downgrade,
}
}
/// 把物理地址映射到虚拟地址
@ -1070,6 +1086,7 @@ impl VMA {
mapped: true,
user_address_space: None,
self_ref: Weak::default(),
provider: Provider::Allocated,
});
return Ok(r);
}
@ -1118,6 +1135,7 @@ impl VMA {
mapped: true,
user_address_space: None,
self_ref: Weak::default(),
provider: Provider::Allocated,
});
drop(flusher);
// kdebug!("VMA::zeroed: flusher dropped");