1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-24 17:06:18 +04:00

Fix bug in swap in/out. Address ailign to 4K.

This commit is contained in:
lcy1996 2018-11-14 00:32:59 +08:00
parent 6652f8daf6
commit c5499a62c5
6 changed files with 12 additions and 10 deletions

View File

@ -13,12 +13,12 @@ impl SwapManager for FifoSwapManager {
fn tick(&mut self) {}
fn push(&mut self, frame: Frame) {
debug!("SwapManager push token: {:x?} vaddr: {:x?}", frame.get_token(), frame.get_virtaddr());
info!("SwapManager push token: {:x?} vaddr: {:x?}", frame.get_token(), frame.get_virtaddr());
self.deque.push_back(frame);
}
fn remove(&mut self, token: usize, addr: VirtAddr) {
debug!("SwapManager remove token: {:x?} vaddr: {:x?}", token, addr);
info!("SwapManager remove token: {:x?} vaddr: {:x?}", token, addr);
let id = self.deque.iter()
.position(|ref x| x.get_virtaddr() == addr && x.get_token() == token)
.expect("address not found");

View File

@ -113,7 +113,7 @@ impl<T: PageTable, M: SwapManager, S: Swapper> SwapExt<T, M, S> {
let Self {ref mut page_table, ref mut swap_manager, ref mut swapper} = self;
let targetpt = &mut *(pt);
let pttoken = {
debug!("the target page table token is {:x?}", targetpt.token());
info!("SET_SWAPPABLE: the target page table token is {:x?}, addr is {:x?}", targetpt.token(), addr);
targetpt.token()
};
targetpt.with(||{
@ -139,14 +139,14 @@ impl<T: PageTable, M: SwapManager, S: Swapper> SwapExt<T, M, S> {
** @param alloc_frame: the function to alloc a free physical frame for once
*/
pub unsafe fn remove_from_swappable<T2: InactivePageTable>(&mut self, pt: *mut T2, addr: VirtAddr, alloc_frame: impl FnOnce() -> PhysAddr){
trace!("come into remove_from swappable");
info!("come into remove_from swappable");
let Self {ref mut page_table, ref mut swap_manager, ref mut swapper} = self;
let targetpt = &mut *(pt);
let pttoken = {
debug!("the target page table token is {:x?}", targetpt.token());
targetpt.token()
};
debug!("try to change pagetable");
info!("try to change pagetable");
targetpt.with(||{
let token = {
let entry = page_table.get_entry(addr);
@ -169,7 +169,7 @@ impl<T: PageTable, M: SwapManager, S: Swapper> SwapExt<T, M, S> {
let data = page_table.get_page_slice_mut(addr);
swapper.swap_in(token, data).unwrap();
});
trace!("come outof femove_from swappable");
trace!("come out of femove_from swappable");
}
/*
@ -301,7 +301,7 @@ impl<T: PageTable, M: SwapManager, S: Swapper> SwapExt<T, M, S> {
}
if(swapin){
unsafe {
self.set_swappable(pt, addr);
self.set_swappable(pt, addr & 0xfffff000);
}
}
//area.get_flags().apply(new_entry); this instruction may be used when hide attr is used

View File

@ -225,7 +225,7 @@ impl ProcessManager {
self.wakeup(*waiter);
}
//proc.context = None;
proc.context = None;
}
}
fn new_vec_default<T: Default>(size: usize) -> Vec<T> {

@ -1 +1 @@
Subproject commit f358204af01f2374ab6ed6ea059f724cd5f2fe6f
Subproject commit a37a65fa13a00c5aa0068c3f2b5d55af6a37dd93

View File

@ -130,7 +130,7 @@ impl ContextImpl {
let mut memory_set = self.memory_set.clone();
info!("finish mmset clone in fork!");
// add the new memory set to the recorder
debug!("fork! new page table token: {:x?}", memory_set.token());
info!("fork! new page table token: {:x?}", memory_set.token());
let mmset_ptr = ((&mut memory_set) as * mut MemorySet) as usize;
memory_set_record().push_back(mmset_ptr);
@ -179,6 +179,7 @@ impl ContextImpl {
impl Drop for ContextImpl{
fn drop(&mut self){
info!("come in to drop for ContextImpl");
// remove the new memory set to the recorder (deprecated in the latest version)
/*
let id = memory_set_record().iter()
@ -251,6 +252,7 @@ fn memory_attr_from(elf_flags: Flags) -> MemoryAttr {
* map the memory area in the memory_set swappalbe, specially for the user process
*/
pub fn memory_set_map_swappable(memory_set: &mut MemorySet){
info!("COME INTO memory set map swappable!");
let pt = unsafe {
memory_set.get_page_table_mut() as *mut InactivePageTable0
};