add some func
This commit is contained in:
parent
350220046a
commit
728566e0fb
|
@ -132,6 +132,7 @@ pub extern "C" fn rust_main(hart_id: usize) -> ! {
|
|||
riscv::register::sscratch::write(0); // todo 寄存器sscratch
|
||||
riscv::register::sstatus::set_sie() // todo 允许被特权级中断打断
|
||||
};
|
||||
|
||||
task::run_until_idle(
|
||||
|| unsafe { task::shared_pop_task(shared_scheduler) },
|
||||
|handle| unsafe { task::shared_add_task(shared_scheduler, handle) }
|
||||
|
@ -206,3 +207,7 @@ impl Future for FibonacciFuture {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn try_enter_user() -> ! {
|
||||
|
||||
}
|
|
@ -142,6 +142,20 @@ impl Mapping {
|
|||
asm!("sfence.vma x0, {asid}", asid = in(reg) asid);
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取当前映射的satp寄存器值
|
||||
pub fn get_satp(&self, asid: AddressSpaceId) -> usize {
|
||||
// 60..64 mode
|
||||
// 44..60 asid
|
||||
// 0..44 ppn
|
||||
use riscv::register::satp::Mode;
|
||||
use bit_field::BitField;
|
||||
let mut bits = 0usize;
|
||||
bits.set_bits(60..64, Mode::Sv39 as usize);
|
||||
bits.set_bits(44..60, asid.into_inner());
|
||||
bits.set_bits(0..44, self.root_ppn.into());
|
||||
bits
|
||||
}
|
||||
}
|
||||
|
||||
// 找到包含虚拟地址段的所有虚拟页
|
||||
|
|
|
@ -58,6 +58,11 @@ impl Process {
|
|||
flags |= Flags::VALID;
|
||||
self.inner.lock().memory_set.alloc_page_range(STACK_SIZE, flags)
|
||||
}
|
||||
/// 得到进程对应的satp寄存器值
|
||||
pub fn satp(&self) -> usize {
|
||||
let asid = self.inner.lock().memory_set.address_space_id;
|
||||
self.inner.lock().memory_set.mapping.get_satp(asid)
|
||||
}
|
||||
}
|
||||
|
||||
/// 进程的编号
|
||||
|
|
|
@ -236,7 +236,7 @@ use crate::memory::{SWAP_FRAME_VA, SWAP_CONTEXT_VA};
|
|||
|
||||
/// 上升到用户态
|
||||
/// 目前让这个函数接收一个 SwapContext 参数和用户的页表,测试使用
|
||||
pub fn switch_to_user(context: SwapContext, satp: usize) -> ! {
|
||||
pub fn switch_to_user(context: &SwapContext, satp: usize) -> ! {
|
||||
use riscv::register::{sstatus::{self, SPP}, stvec::{self, TrapMode}};
|
||||
// 关中断
|
||||
unsafe { sstatus::clear_sie(); }
|
||||
|
@ -257,7 +257,7 @@ pub fn switch_to_user(context: SwapContext, satp: usize) -> ! {
|
|||
riscv::register::sepc::write(context.epc);
|
||||
|
||||
// todo: 如何处理 tp 寄存器
|
||||
|
||||
|
||||
// 用户 satp 寄存器
|
||||
// 需要获取当前任务的页表
|
||||
let user_satp: usize = satp;
|
||||
|
|
Loading…
Reference in New Issue