Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c0989e6

Browse files
committed
小的修正
1 parent db3a1c6 commit c0989e6

File tree

4 files changed

+21
-38
lines changed

4 files changed

+21
-38
lines changed

os/src/interrupt/handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub fn handle_interrupt(context: &mut Context, scause: Scause, stval: usize) ->
6565
scause.cause()
6666
)),
6767
}
68-
.unwrap_or_else(|msg| fault(msg, stval))
68+
.unwrap_or_else(|msg| fault(msg, scause, stval))
6969
}
7070

7171
/// 处理 ebreak 断点
@@ -109,13 +109,13 @@ fn supervisor_external(context: &mut Context) -> Result<*mut Context, String> {
109109
}
110110

111111
/// 出现未能解决的异常,终止当前线程
112-
fn fault(msg: String, stval: usize) -> *mut Context {
112+
fn fault(msg: String, scause: Scause, stval: usize) -> *mut Context {
113113
println!(
114114
"{:#x?} terminated: {}",
115115
PROCESSOR.get().current_thread(),
116116
msg
117117
);
118-
println!("stval: {:x}", stval);
118+
println!("cause: {:?}, stval: {:x}", scause.cause(), stval);
119119

120120
PROCESSOR.get().kill_current_thread();
121121
// 跳转到 PROCESSOR 调度的下一个线程

os/src/memory/mapping/mapping.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub struct Mapping {
2525
/// 根页表的物理页号
2626
root_ppn: PhysicalPageNumber,
2727
/// 所有分配的物理页面映射信息
28-
swapper: SwapperImpl,
28+
mapped_pairs: SwapperImpl,
2929
/// 被换出的页面存储在虚拟内存文件中的 Tracker
3030
swapped_pages: HashMap<VirtualPageNumber, SwapTracker>,
3131
}
@@ -50,7 +50,7 @@ impl Mapping {
5050
Ok(Mapping {
5151
page_tables: vec![root_table],
5252
root_ppn,
53-
swapper: SwapperImpl::new(frame_quota),
53+
mapped_pairs: SwapperImpl::new(frame_quota),
5454
swapped_pages: HashMap::new(),
5555
})
5656
}
@@ -72,13 +72,12 @@ impl Mapping {
7272
.copy_from_slice(data);
7373
}
7474
}
75-
Ok(())
7675
}
7776
// 需要分配帧进行映射
7877
MapType::Framed => {
7978
for vpn in segment.page_range().iter() {
8079
// 如果有初始化数据,找到相应的数据
81-
let page_data = if init_data.unwrap_or(&[0u8; 0]).is_empty() {
80+
let page_data = if init_data.is_none() || init_data.unwrap().is_empty() {
8281
[0u8; PAGE_SIZE]
8382
} else {
8483
// 这里必须进行一些调整,因为传入的数据可能并非按照整页对齐
@@ -110,15 +109,15 @@ impl Mapping {
110109
};
111110

112111
// 建立映射,先检查是否有配额来分配新的物理页面
113-
if !self.swapper.full() {
112+
if !self.mapped_pairs.full() {
114113
// 有配额,分配新的物理页面
115114
let mut frame = FRAME_ALLOCATOR.lock().alloc()?;
116115
// 更新页表
117116
self.map_one(vpn, Some(frame.page_number()), segment.flags)?;
118117
// 写入数据
119118
(*frame).copy_from_slice(&page_data);
120119
// 保存
121-
self.swapper.push(vpn, frame);
120+
self.mapped_pairs.push(vpn, frame);
122121
} else {
123122
// 配额用完,改为在置换文件中分配一个页面
124123
let swap_page = SwapTracker::new()?;
@@ -130,10 +129,9 @@ impl Mapping {
130129
self.swapped_pages.insert(vpn, swap_page);
131130
}
132131
}
133-
134-
Ok(())
135132
}
136133
}
134+
Ok(())
137135
}
138136

139137
/// 移除一段映射
@@ -144,7 +142,7 @@ impl Mapping {
144142
// 从页表中清除项
145143
entry.clear();
146144
}
147-
self.swapper
145+
self.mapped_pairs
148146
.retain(|vpn| !segment.page_range().contains(*vpn));
149147
self.swapped_pages
150148
.retain(|vpn, _| !segment.page_range().contains(*vpn));
@@ -246,9 +244,9 @@ impl Mapping {
246244
.ok_or("stval page is not mapped")?;
247245
let page_data = swap_tracker.read();
248246

249-
if self.swapper.full() {
247+
if self.mapped_pairs.full() {
250248
// 取出一个映射
251-
let (popped_vpn, mut popped_frame) = self.swapper.pop().unwrap();
249+
let (popped_vpn, mut popped_frame) = self.mapped_pairs.pop().unwrap();
252250
// print!("{:x?} -> {:x?}", popped_vpn, vpn);
253251
// 交换数据
254252
swap_tracker.write(&*popped_frame);
@@ -257,7 +255,7 @@ impl Mapping {
257255
self.invalidate_one(popped_vpn)?;
258256
self.remap_one(vpn, popped_frame.page_number())?;
259257
// 更新记录
260-
self.swapper.push(vpn, popped_frame);
258+
self.mapped_pairs.push(vpn, popped_frame);
261259
self.swapped_pages.insert(popped_vpn, swap_tracker);
262260
} else {
263261
// 添加新的映射
@@ -267,7 +265,7 @@ impl Mapping {
267265
// 更新映射
268266
self.remap_one(vpn, frame.page_number())?;
269267
// 更新记录
270-
self.swapper.push(vpn, frame);
268+
self.mapped_pairs.push(vpn, frame);
271269
}
272270
Ok(())
273271
}

os/src/memory/mapping/memory_set.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! 一个线程中关于内存空间的所有信息 [`MemorySet`]
2-
//!
32
43
use crate::memory::{
54
address::*,

os/src/memory/mapping/swapper.rs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
33
use crate::memory::{frame::FrameTracker, *};
44
use alloc::collections::VecDeque;
5-
use hashbrown::HashMap;
65

7-
/// 页面置换算法
6+
/// 管理一个线程所映射的页面的置换操作
87
pub trait Swapper {
98
/// 新建带有一个分配数量上限的置换器
109
fn new(quota: usize) -> Self;
@@ -18,9 +17,6 @@ pub trait Swapper {
1817
/// 添加一组映射(不会在以达到分配上限时调用)
1918
fn push(&mut self, vpn: VirtualPageNumber, frame: FrameTracker);
2019

21-
/// 找到某个页号对应的页面
22-
fn find(&mut self, vpn: VirtualPageNumber) -> Option<&mut FrameTracker>;
23-
2420
/// 只保留符合某种条件的条目(用于移除一段虚拟地址)
2521
fn retain(&mut self, predicate: impl Fn(&VirtualPageNumber) -> bool);
2622
}
@@ -29,39 +25,29 @@ pub type SwapperImpl = FIFOSwapper;
2925

3026
/// 页面置换算法基础实现:FIFO
3127
pub struct FIFOSwapper {
32-
/// 记录所有映射
33-
entries: HashMap<VirtualPageNumber, FrameTracker>,
34-
/// 记录映射添加的顺序
35-
queue: VecDeque<VirtualPageNumber>,
28+
/// 记录映射和添加的顺序
29+
queue: VecDeque<(VirtualPageNumber, FrameTracker)>,
3630
/// 映射数量上限
3731
quota: usize,
3832
}
3933

4034
impl Swapper for FIFOSwapper {
4135
fn new(quota: usize) -> Self {
4236
Self {
43-
entries: HashMap::new(),
4437
queue: VecDeque::new(),
4538
quota,
4639
}
4740
}
4841
fn full(&self) -> bool {
49-
self.entries.len() == self.quota
42+
self.queue.len() == self.quota
5043
}
5144
fn pop(&mut self) -> Option<(VirtualPageNumber, FrameTracker)> {
52-
self.queue
53-
.pop_front()
54-
.map(|vpn| (vpn, self.entries.remove(&vpn).unwrap()))
45+
self.queue.pop_front()
5546
}
5647
fn push(&mut self, vpn: VirtualPageNumber, frame: FrameTracker) {
57-
self.queue.push_back(vpn);
58-
self.entries.insert(vpn, frame);
59-
}
60-
fn find(&mut self, vpn: VirtualPageNumber) -> Option<&mut FrameTracker> {
61-
self.entries.get_mut(&vpn)
48+
self.queue.push_back((vpn, frame));
6249
}
6350
fn retain(&mut self, predicate: impl Fn(&VirtualPageNumber) -> bool) {
64-
self.queue.retain(|vpn| predicate(vpn));
65-
self.entries.retain(|vpn, _| predicate(vpn));
51+
self.queue.retain(|(vpn, _)| predicate(vpn));
6652
}
6753
}

0 commit comments

Comments
 (0)