@@ -3,17 +3,23 @@ use context::TaskContext;
33use lazy_static:: lazy_static;
44use task:: { TaskControlBlock , TaskStatus } ;
55
6- use crate :: { loader, sbi:: shutdown, sync:: UPSafeCell , timer:: get_time_us, trap:: TrapContext } ;
6+ use crate :: {
7+ loader,
8+ mm:: { MapPermission , VPNRange , VirtPageNum } ,
9+ sbi:: shutdown,
10+ sync:: UPSafeCell ,
11+ timer:: get_time_us,
12+ trap:: TrapContext ,
13+ } ;
714
815mod context;
916mod switch;
1017mod task;
1118
1219lazy_static ! {
1320 pub static ref TASK_MANAGER : TaskManager = {
14- log:: info!( "init TASK_MANAGER" ) ;
1521 let num_app = loader:: get_num_app( ) ;
16- log:: info!( "num_app = {}" , num_app) ;
22+ log:: info!( "init TASK_MANAGER: num_app = {}" , num_app) ;
1723 let mut tasks = Vec :: new( ) ;
1824
1925 for i in 0 ..num_app {
@@ -159,34 +165,6 @@ impl TaskManager {
159165 inner. tasks [ curr] . user_time += inner. refresh_stop_watch ( ) ;
160166 }
161167
162- // fn current_task(&self) -> usize {
163- // let inner = self.inner.exclusive_access();
164- // inner.curr_task
165- // }
166-
167- // fn current_task_status(&self) -> TaskStatus {
168- // let inner = self.inner.exclusive_access();
169- // inner.tasks[inner.curr_task].task_status
170- // }
171-
172- // fn current_task_run_time(&self) -> usize {
173- // let inner = self.inner.exclusive_access();
174- // let curr = &inner.tasks[inner.curr_task];
175- // curr.kernel_time + curr.user_time
176- // }
177-
178- // fn record_syscall(&self, id: usize) {
179- // let mut inner = self.inner.exclusive_access();
180- // let curr = inner.curr_task;
181- // inner.tasks[curr].syscall_times[id] += 1;
182- // }
183-
184- // // todo: opt copy?
185- // fn current_task_syscall_times(&self) -> [usize; MAX_SYSCALL_NUM] {
186- // let inner = self.inner.exclusive_access();
187- // inner.tasks[inner.curr_task].syscall_times.clone()
188- // }
189-
190168 fn get_current_token ( & self ) -> usize {
191169 let inner = self . inner . exclusive_access ( ) ;
192170 let current = inner. curr_task ;
@@ -247,38 +225,42 @@ pub fn user_time_end() {
247225 TASK_MANAGER . user_time_end ( )
248226}
249227
250- // #[repr(C)]
251- // pub struct TaskInfo {
252- // pub status: TaskStatus,
253- // pub call: [usize; MAX_SYSCALL_NUM],
254- // pub time: usize,
255- // }
256-
257- // pub fn get_current_task_id() -> usize {
258- // TASK_MANAGER.current_task()
259- // }
260-
261- // pub fn get_current_task_status() -> TaskStatus {
262- // TASK_MANAGER.current_task_status()
263- // }
264-
265- // pub fn get_current_task_run_time() -> usize {
266- // TASK_MANAGER.current_task_run_time()
267- // }
268-
269- // pub fn current_task_record_syscall(id: usize) {
270- // TASK_MANAGER.record_syscall(id);
271- // }
272-
273- // pub fn get_current_task_syscall_times() -> [usize; MAX_SYSCALL_NUM] {
274- // let si = TASK_MANAGER.current_task_syscall_times();
275- // si
276- // }
277-
278228pub fn current_user_token ( ) -> usize {
279229 TASK_MANAGER . get_current_token ( )
280230}
281231
282232pub fn current_trap_cx ( ) -> & ' static mut TrapContext {
283233 TASK_MANAGER . get_current_trap_cx ( )
284234}
235+
236+ pub fn current_task_map_new_area (
237+ start_vpn : VirtPageNum ,
238+ end_vpn : VirtPageNum ,
239+ map_perm : MapPermission ,
240+ ) -> isize {
241+ let mut inner = TASK_MANAGER . inner . exclusive_access ( ) ;
242+ let current = inner. curr_task ;
243+ let curr_mem_set = & mut inner. tasks [ current] . memory_set ;
244+ for vpn in VPNRange :: new ( start_vpn, end_vpn) {
245+ match curr_mem_set. translate ( vpn) {
246+ Some ( pte) if pte. is_valid ( ) => return -1 , // mapped already
247+ _ => { }
248+ }
249+ }
250+ curr_mem_set. insert_framed_area ( start_vpn. into ( ) , end_vpn. into ( ) , map_perm) ;
251+ 0
252+ }
253+
254+ pub fn current_task_unmap_area ( start_vpn : VirtPageNum , end_vpn : VirtPageNum ) -> isize {
255+ let mut inner = TASK_MANAGER . inner . exclusive_access ( ) ;
256+ let current = inner. curr_task ;
257+ let curr_mem_set = & mut inner. tasks [ current] . memory_set ;
258+ for vpn in VPNRange :: new ( start_vpn, end_vpn) {
259+ match curr_mem_set. translate ( vpn) {
260+ Some ( pte) if !pte. is_valid ( ) => return -1 , // not valid
261+ Some ( _) => curr_mem_set. page_table_mut ( ) . unmap ( vpn) ,
262+ _ => return -1 , // no entry
263+ }
264+ }
265+ 0
266+ }
0 commit comments