Skip to content

Commit 9639e30

Browse files
author
qiaoqiming
committed
fix #13 page fault
1 parent 969ca1b commit 9639e30

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

os/src/memory/memory_set/area.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,15 @@ impl MemoryArea {
5050
pub fn page_copy(&self, pt: &mut PageTableImpl, src: usize, length: usize) {
5151
let mut l = length;
5252
let mut s = src;
53+
let mut offset = self.start % PAGE_SIZE;
5354
for page in PageRange::new(self.start, self.end) {
55+
let copy_size = PAGE_SIZE-offset;
5456
self.handler
55-
.page_copy(pt, page, s, if l < PAGE_SIZE { l } else { PAGE_SIZE });
56-
s += PAGE_SIZE;
57-
if l >= PAGE_SIZE {
58-
l -= PAGE_SIZE;
57+
.page_copy(pt, page, offset, s, if l < copy_size { l } else { copy_size });
58+
offset = 0;
59+
s += copy_size;
60+
if l >= copy_size {
61+
l -= copy_size;
5962
}
6063
}
6164
}

os/src/memory/memory_set/handler.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub trait MemoryHandler: Debug + 'static {
1010
fn box_clone(&self) -> Box<dyn MemoryHandler>;
1111
fn map(&self, pt: &mut PageTableImpl, va: usize, attr: &MemoryAttr);
1212
fn unmap(&self, pt: &mut PageTableImpl, va: usize);
13-
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, src: usize, length: usize);
13+
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, va_offset: usize, src: usize, length: usize);
1414
}
1515

1616
impl Clone for Box<dyn MemoryHandler> {
@@ -39,12 +39,12 @@ impl MemoryHandler for Linear {
3939
fn unmap(&self, pt: &mut PageTableImpl, va: usize) {
4040
pt.unmap(va);
4141
}
42-
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, src: usize, length: usize) {
42+
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, va_offset: usize, src: usize, length: usize) {
4343
let pa = pt.get_entry(va).expect("get pa error!").0.addr().as_usize();
4444
assert!(va == access_pa_via_va(pa));
4545
assert!(va == pa + self.offset);
4646
unsafe {
47-
let dst = core::slice::from_raw_parts_mut(va as *mut u8, PAGE_SIZE);
47+
let dst = core::slice::from_raw_parts_mut((va+va_offset) as *mut u8, PAGE_SIZE);
4848
if length > 0 {
4949
let src = core::slice::from_raw_parts(src as *const u8, PAGE_SIZE);
5050
dst[..length].clone_from_slice(&src[..length]);
@@ -78,10 +78,10 @@ impl MemoryHandler for ByFrame {
7878
fn unmap(&self, pt: &mut PageTableImpl, va: usize) {
7979
pt.unmap(va);
8080
}
81-
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, src: usize, length: usize) {
81+
fn page_copy(&self, pt: &mut PageTableImpl, va: usize, va_offset: usize, src: usize, length: usize) {
8282
let pa = pt.get_entry(va).expect("get pa error!").0.addr().as_usize();
8383
unsafe {
84-
let dst = core::slice::from_raw_parts_mut(access_pa_via_va(pa) as *mut u8, PAGE_SIZE);
84+
let dst = core::slice::from_raw_parts_mut((access_pa_via_va(pa)+va_offset) as *mut u8, PAGE_SIZE);
8585
if length > 0 {
8686
let src = core::slice::from_raw_parts(src as *const u8, PAGE_SIZE);
8787
dst[..length].clone_from_slice(&src[..length]);

0 commit comments

Comments
 (0)