From b68278f22eeaa50c4e59f234fb7980ff0c9765c6 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 20 Dec 2020 08:46:27 +0800 Subject: [PATCH] Fix virtio_phys_to_virt. Now we can load app from disk on qemu/k210! --- os/src/drivers/block/virtio_blk.rs | 8 +++----- os/src/mm/memory_set.rs | 4 ++++ os/src/mm/mod.rs | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/os/src/drivers/block/virtio_blk.rs b/os/src/drivers/block/virtio_blk.rs index 7d09e22..2c045ed 100644 --- a/os/src/drivers/block/virtio_blk.rs +++ b/os/src/drivers/block/virtio_blk.rs @@ -7,6 +7,8 @@ use crate::mm::{ PhysPageNum, FrameTracker, StepByOne, + PageTable, + kernel_token, }; use super::BlockDevice; use spin::Mutex; @@ -23,12 +25,9 @@ lazy_static! { impl BlockDevice for VirtIOBlock { fn read_block(&self, block_id: usize, buf: &mut [u8]) { - //println!("read block {}", block_id); self.0.lock().read_block(block_id, buf).expect("Error when reading VirtIOBlk"); - //println!("read block OK!"); } fn write_block(&self, block_id: usize, buf: &[u8]) { - //println!("write block {}", block_id); self.0.lock().write_block(block_id, buf).expect("Error when writing VirtIOBlk"); } } @@ -47,7 +46,6 @@ pub extern "C" fn virtio_dma_alloc(pages: usize) -> PhysAddr { for i in 0..pages { let frame = frame_alloc().unwrap(); if i == 0 { ppn_base = frame.ppn; } - println!("virtio_dma_alloc {:?}", frame.ppn); assert_eq!(frame.ppn.0, ppn_base.0 + i); QUEUE_FRAMES.lock().push(frame); } @@ -71,5 +69,5 @@ pub extern "C" fn virtio_phys_to_virt(paddr: PhysAddr) -> VirtAddr { #[no_mangle] pub extern "C" fn virtio_virt_to_phys(vaddr: VirtAddr) -> PhysAddr { - PhysAddr(vaddr.0) + PageTable::from_token(kernel_token()).translate_va(vaddr).unwrap() } diff --git a/os/src/mm/memory_set.rs b/os/src/mm/memory_set.rs index 3f2b8ac..b3a8b2e 100644 --- a/os/src/mm/memory_set.rs +++ b/os/src/mm/memory_set.rs @@ -36,6 +36,10 @@ lazy_static! { )); } +pub fn kernel_token() -> usize { + KERNEL_SPACE.lock().token() +} + pub struct MemorySet { page_table: PageTable, areas: Vec, diff --git a/os/src/mm/mod.rs b/os/src/mm/mod.rs index 5717f5f..7eedef2 100644 --- a/os/src/mm/mod.rs +++ b/os/src/mm/mod.rs @@ -4,11 +4,12 @@ mod frame_allocator; mod page_table; mod memory_set; -use page_table::{PageTable, PTEFlags}; +use page_table::PTEFlags; use address::VPNRange; pub use address::{PhysAddr, VirtAddr, PhysPageNum, VirtPageNum, StepByOne}; pub use frame_allocator::{FrameTracker, frame_alloc, frame_dealloc,}; pub use page_table::{ + PageTable, PageTableEntry, translated_byte_buffer, translated_str, @@ -16,7 +17,7 @@ pub use page_table::{ UserBuffer, UserBufferIterator, }; -pub use memory_set::{MemorySet, KERNEL_SPACE, MapPermission}; +pub use memory_set::{MemorySet, KERNEL_SPACE, MapPermission, kernel_token}; pub use memory_set::remap_test; pub fn init() {