ch4 ok on qemu/k210 && Remove some comments.
This commit is contained in:
parent
485db04a2b
commit
9e861c2819
8 changed files with 0 additions and 48 deletions
|
@ -11,14 +11,11 @@ pub struct FrameTracker {
|
|||
|
||||
impl FrameTracker {
|
||||
pub fn new(ppn: PhysPageNum) -> Self {
|
||||
//println!("into FrameTracker::new, ppn = {:?}", ppn);
|
||||
// page cleaning
|
||||
let bytes_array = ppn.get_bytes_array();
|
||||
//println!("ptr = {:p}, len = {}", bytes_array.as_ptr(), bytes_array.len());
|
||||
for i in bytes_array {
|
||||
*i = 0;
|
||||
}
|
||||
//println!("OK");
|
||||
Self { ppn }
|
||||
}
|
||||
}
|
||||
|
@ -62,12 +59,9 @@ impl FrameAllocator for StackFrameAllocator {
|
|||
}
|
||||
}
|
||||
fn alloc(&mut self) -> Option<PhysPageNum> {
|
||||
//println!("into StackFrameAllocator::alloc()");
|
||||
if let Some(ppn) = self.recycled.pop() {
|
||||
//println!("has recycled!");
|
||||
Some(ppn.into())
|
||||
} else {
|
||||
//println!("run out recycled, current = {}, end = {}!", self.current, self.end);
|
||||
if self.current == self.end {
|
||||
None
|
||||
} else {
|
||||
|
@ -107,7 +101,6 @@ pub fn init_frame_allocator() {
|
|||
}
|
||||
|
||||
pub fn frame_alloc() -> Option<FrameTracker> {
|
||||
//println!("into frame_alloc()");
|
||||
FRAME_ALLOCATOR
|
||||
.lock()
|
||||
.alloc()
|
||||
|
|
|
@ -124,24 +124,19 @@ impl MemorySet {
|
|||
/// Include sections in elf and trampoline and TrapContext and user stack,
|
||||
/// also returns user_sp and entry point.
|
||||
pub fn from_elf(elf_data: &[u8]) -> (Self, usize, usize) {
|
||||
//println!("into from_elf!");
|
||||
let mut memory_set = Self::new_bare();
|
||||
// map trampoline
|
||||
//println!("mapping trampoline!");
|
||||
memory_set.map_trampoline();
|
||||
// map program headers of elf, with U flag
|
||||
//println!("mapping elf!");
|
||||
let elf = xmas_elf::ElfFile::new(elf_data).unwrap();
|
||||
let elf_header = elf.header;
|
||||
let magic = elf_header.pt1.magic;
|
||||
assert_eq!(magic, [0x7f, 0x45, 0x4c, 0x46], "invalid elf!");
|
||||
let ph_count = elf_header.pt2.ph_count();
|
||||
//println!("ph_count = {}", ph_count);
|
||||
let mut max_end_vpn = VirtPageNum(0);
|
||||
for i in 0..ph_count {
|
||||
let ph = elf.program_header(i).unwrap();
|
||||
if ph.get_type().unwrap() == xmas_elf::program::Type::Load {
|
||||
//println!("ph#{},va={},memsz={}", i, ph.virtual_addr(), ph.mem_size());
|
||||
let start_va: VirtAddr = (ph.virtual_addr() as usize).into();
|
||||
let end_va: VirtAddr = ((ph.virtual_addr() + ph.mem_size()) as usize).into();
|
||||
let mut map_perm = MapPermission::U;
|
||||
|
@ -149,16 +144,13 @@ impl MemorySet {
|
|||
if ph_flags.is_read() { map_perm |= MapPermission::R; }
|
||||
if ph_flags.is_write() { map_perm |= MapPermission::W; }
|
||||
if ph_flags.is_execute() { map_perm |= MapPermission::X; }
|
||||
//println!("creating MapArea!");
|
||||
let map_area = MapArea::new(
|
||||
start_va,
|
||||
end_va,
|
||||
MapType::Framed,
|
||||
map_perm,
|
||||
);
|
||||
//println!("end_vpn = {:?}", map_area.vpn_range.get_end());
|
||||
max_end_vpn = map_area.vpn_range.get_end();
|
||||
//println!("pushing MapArea!");
|
||||
memory_set.push(
|
||||
map_area,
|
||||
Some(&elf.input[ph.offset() as usize..(ph.offset() + ph.file_size()) as usize])
|
||||
|
@ -166,13 +158,11 @@ impl MemorySet {
|
|||
}
|
||||
}
|
||||
// map user stack with U flags
|
||||
//println!("mapping user stack!");
|
||||
let max_end_va: VirtAddr = max_end_vpn.into();
|
||||
let mut user_stack_bottom: usize = max_end_va.into();
|
||||
// guard page
|
||||
user_stack_bottom += PAGE_SIZE;
|
||||
let user_stack_top = user_stack_bottom + USER_STACK_SIZE;
|
||||
//println!("user stack={:#x},{:#x}", user_stack_bottom, user_stack_top);
|
||||
memory_set.push(MapArea::new(
|
||||
user_stack_bottom.into(),
|
||||
user_stack_top.into(),
|
||||
|
@ -180,7 +170,6 @@ impl MemorySet {
|
|||
MapPermission::R | MapPermission::W | MapPermission::U,
|
||||
), None);
|
||||
// map TrapContext
|
||||
//println!("mapping TrapContext {:#x},{:#x}", TRAP_CONTEXT, TRAMPOLINE);
|
||||
memory_set.push(MapArea::new(
|
||||
TRAP_CONTEXT.into(),
|
||||
TRAMPOLINE.into(),
|
||||
|
|
|
@ -61,7 +61,6 @@ pub struct PageTable {
|
|||
/// Assume that it won't oom when creating/mapping.
|
||||
impl PageTable {
|
||||
pub fn new() -> Self {
|
||||
//println!("into PageTable::new()");
|
||||
let frame = frame_alloc().unwrap();
|
||||
PageTable {
|
||||
root_ppn: frame.ppn,
|
||||
|
@ -95,8 +94,6 @@ impl PageTable {
|
|||
result
|
||||
}
|
||||
fn find_pte(&self, vpn: VirtPageNum) -> Option<&PageTableEntry> {
|
||||
//println!("into find_pte");
|
||||
//println!("root_ppn = {:?}", self.root_ppn);
|
||||
let idxs = vpn.indexes();
|
||||
let mut ppn = self.root_ppn;
|
||||
let mut result: Option<&PageTableEntry> = None;
|
||||
|
@ -115,7 +112,6 @@ impl PageTable {
|
|||
}
|
||||
#[allow(unused)]
|
||||
pub fn map(&mut self, vpn: VirtPageNum, ppn: PhysPageNum, flags: PTEFlags) {
|
||||
//println!("mapping {:?} {:?}", vpn, ppn);
|
||||
let pte = self.find_pte_create(vpn).unwrap();
|
||||
assert!(!pte.is_valid(), "vpn {:?} is mapped before mapping", vpn);
|
||||
*pte = PageTableEntry::new(ppn, flags | PTEFlags::V);
|
||||
|
@ -127,7 +123,6 @@ impl PageTable {
|
|||
*pte = PageTableEntry::empty();
|
||||
}
|
||||
pub fn translate(&self, vpn: VirtPageNum) -> Option<PageTableEntry> {
|
||||
//println!("into PageTable::translate");
|
||||
self.find_pte(vpn)
|
||||
.map(|pte| {pte.clone()})
|
||||
}
|
||||
|
@ -137,22 +132,17 @@ impl PageTable {
|
|||
}
|
||||
|
||||
pub fn translated_byte_buffer(token: usize, ptr: *const u8, len: usize) -> Vec<&'static [u8]> {
|
||||
//println!("into translated_byte_buffer!");
|
||||
let page_table = PageTable::from_token(token);
|
||||
let mut start = ptr as usize;
|
||||
let end = start + len;
|
||||
//println!("start={:#x},end={:#x}", start, end);
|
||||
let mut v = Vec::new();
|
||||
while start < end {
|
||||
//println!("start={:#x}", start);
|
||||
let start_va = VirtAddr::from(start);
|
||||
let mut vpn = start_va.floor();
|
||||
//println!("vpn={:?}", vpn);
|
||||
let ppn = page_table
|
||||
.translate(vpn)
|
||||
.unwrap()
|
||||
.ppn();
|
||||
//println!("ppn={:?}", ppn);
|
||||
vpn.step();
|
||||
let mut end_va: VirtAddr = vpn.into();
|
||||
end_va = end_va.min(VirtAddr::from(end));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue