Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Rubiczhang opened this issue Jul 27, 2020 · 0 comments
Open

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

Rubiczhang opened this issue Jul 27, 2020 · 0 comments

Comments

@Rubiczhang
Copy link

Rubiczhang commented Jul 27, 2020

同学你好,关于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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant