os-summer-of-code-daily icon indicating copy to clipboard operation
os-summer-of-code-daily copied to clipboard

关于lab3实验题的rust语法问题

Open Rubiczhang opened this issue 4 years ago • 0 comments

同学你好,关于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))

Rubiczhang avatar Jul 27 '20 02:07 Rubiczhang