mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-20 18:26:32 +00:00
- 添加文件映射相关接口,目前已简单实现fat文件系统的私有映射和共享映射 - 添加msync系统调用(由于当前未实现脏页自动回写,需要手动调用msync进行同步) - 简单实现PageCache(暂时使用HashMap进行文件页号与页的映射) - 添加新的PageFlags标志结构,原PageFlags改名为EntryFlags - 参考linux使用protection_map映射表进行页面标志的获取 - 添加页面回收机制 - 添加页面回收内核线程 - 缺页中断使用的锁修改为irq_save; 添加脏页回写机制 - 修复do_cow_page死锁问题 - 访问非法地址时发送信号终止进程 - 修复重复插入反向vma表的错误 - 添加test_filemap文件映射测试程序
85 lines
2.6 KiB
Rust
85 lines
2.6 KiB
Rust
use system_error::SystemError;
|
||
|
||
use crate::arch::{mm::PageMapper, MMArch};
|
||
|
||
use super::{page::Flusher, syscall::MadvFlags, ucontext::LockedVMA, VmFlags};
|
||
|
||
impl LockedVMA {
|
||
pub fn do_madvise(
|
||
&self,
|
||
behavior: MadvFlags,
|
||
_mapper: &mut PageMapper,
|
||
_flusher: impl Flusher<MMArch>,
|
||
) -> Result<(), SystemError> {
|
||
//TODO https://code.dragonos.org.cn/xref/linux-6.6.21/mm/madvise.c?fi=madvise#do_madvise
|
||
let mut vma = self.lock_irqsave();
|
||
let mut new_flags = *vma.vm_flags();
|
||
match behavior {
|
||
MadvFlags::MADV_REMOVE => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_WILLNEED => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_COLD => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_PAGEOUT => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_FREE => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_POPULATE_READ | MadvFlags::MADV_POPULATE_WRITE => {
|
||
// TODO
|
||
}
|
||
|
||
MadvFlags::MADV_NORMAL => {
|
||
new_flags = new_flags & !VmFlags::VM_RAND_READ & !VmFlags::VM_SEQ_READ
|
||
}
|
||
|
||
MadvFlags::MADV_SEQUENTIAL => {
|
||
new_flags = (new_flags & !VmFlags::VM_RAND_READ) | VmFlags::VM_SEQ_READ
|
||
}
|
||
MadvFlags::MADV_RANDOM => {
|
||
new_flags = (new_flags & !VmFlags::VM_SEQ_READ) | VmFlags::VM_RAND_READ
|
||
}
|
||
|
||
MadvFlags::MADV_DONTFORK => new_flags |= VmFlags::VM_DONTCOPY,
|
||
|
||
MadvFlags::MADV_DOFORK => {
|
||
if vma.vm_flags().contains(VmFlags::VM_IO) {
|
||
return Err(SystemError::EINVAL);
|
||
}
|
||
new_flags &= !VmFlags::VM_DONTCOPY;
|
||
}
|
||
|
||
MadvFlags::MADV_WIPEONFORK => {
|
||
//MADV_WIPEONFORK仅支持匿名映射,后续实现其他映射方式后要在此处添加判断条件
|
||
new_flags |= VmFlags::VM_WIPEONFORK;
|
||
}
|
||
|
||
MadvFlags::MADV_KEEPONFORK => new_flags &= !VmFlags::VM_WIPEONFORK,
|
||
|
||
MadvFlags::MADV_DONTDUMP => new_flags |= VmFlags::VM_DONTDUMP,
|
||
|
||
//MADV_DODUMP不支持巨页映射,后续需要添加判断条件
|
||
MadvFlags::MADV_DODUMP => new_flags &= !VmFlags::VM_DONTDUMP,
|
||
|
||
MadvFlags::MADV_MERGEABLE | MadvFlags::MADV_UNMERGEABLE => {}
|
||
|
||
MadvFlags::MADV_HUGEPAGE | MadvFlags::MADV_NOHUGEPAGE => {}
|
||
|
||
MadvFlags::MADV_COLLAPSE => {}
|
||
_ => {}
|
||
}
|
||
vma.set_vm_flags(new_flags);
|
||
Ok(())
|
||
}
|
||
}
|