os-summer-of-code-daily
os-summer-of-code-daily copied to clipboard
关于lab3实验题的rust语法问题
同学你好,关于lab3的ClockSwapper我有一些疑问:
fn pop(&mut self) -> Option<(VirtualPageNumber, FrameTracker)> {
let len = self.queue.len()-1;
let mut index:usize = 0;
let mut isfound:bool = false;
unsafe{
loop{
for i in 0..(len+1){
//为什么让pe = xxx.clone() as * mut PageTableEntry
//就可以达到 “修改(*pe)相当于修改页表项” 的目的
//我对这个问题的不理解来自于:
// 我认为PageTableEntry 是包含了一个usize的元组结构体,相当于在堆里面存了一个usize,然后栈上面有一个指针指向这个usize (为了方便,记usize为us, 指针记ptr)
//Q1:(如果是这样的话,entries存的也就是512个指针了?所以不太可能是这样,那么PageTableEntry在内存里是一个怎么样的分布呢?)
// entry在src/mapping/mapping.rs: lin157中定义的时候应该是一个&mut PageTableEntry类型的,并且也是在line263中以这个类型传进push的
// Q2:为什么在push的形参要接受的是一个*mut PageTableEntry类型
// 这里你把* mut PageTableEntry类型的 entry 强制转换成了usize, 我的理解是us的值
// Q3:那为什么要用clone()
let pe = self.queue[i].2.clone() as *mut PageTableEntry;
let mut flags = (*pe).flags().clone();
if flags.contains(Flags::ACCESSED) {
flags.set(Flags::ACCESSED,false);
//println!("{:?}",flags);
(*pe).set_flags(flags);
} else {
//println!("{:?}",flags);
index = i;
isfound = true;
break;
}
}
if isfound {
break;
}
}
}
//println!("{:?}",index);
let f = self.queue.remove(index);
Some((f.0,f.1))