14fda81ceSLoGin use crate::mm::{ 24fda81ceSLoGin allocator::page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage}, 34fda81ceSLoGin page::PageFlags, 44fda81ceSLoGin MemoryManagementArch, PhysAddr, VirtAddr, 54fda81ceSLoGin }; 64fda81ceSLoGin 74fda81ceSLoGin pub mod bump; 8*666cffedSLoGin pub(super) mod init; 94fda81ceSLoGin 104fda81ceSLoGin pub type PageMapper = crate::mm::page::PageMapper<RiscV64MMArch, LockedFrameAllocator>; 114fda81ceSLoGin 124fda81ceSLoGin /// RiscV64的内存管理架构结构体 134fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 144fda81ceSLoGin pub struct RiscV64MMArch; 154fda81ceSLoGin 164fda81ceSLoGin impl MemoryManagementArch for RiscV64MMArch { 174fda81ceSLoGin const PAGE_SHIFT: usize = 12; 184fda81ceSLoGin 194fda81ceSLoGin const PAGE_ENTRY_SHIFT: usize = 9; 204fda81ceSLoGin 214fda81ceSLoGin /// sv39分页只有三级 224fda81ceSLoGin const PAGE_LEVELS: usize = 3; 234fda81ceSLoGin 244fda81ceSLoGin const ENTRY_ADDRESS_SHIFT: usize = 39; 254fda81ceSLoGin 264fda81ceSLoGin const ENTRY_FLAG_DEFAULT_PAGE: usize = Self::ENTRY_FLAG_PRESENT; 274fda81ceSLoGin 284fda81ceSLoGin const ENTRY_FLAG_DEFAULT_TABLE: usize = Self::ENTRY_FLAG_PRESENT; 294fda81ceSLoGin 304fda81ceSLoGin const ENTRY_FLAG_PRESENT: usize = 1 << 0; 314fda81ceSLoGin 324fda81ceSLoGin const ENTRY_FLAG_READONLY: usize = 1 << 1; 334fda81ceSLoGin 344fda81ceSLoGin const ENTRY_FLAG_READWRITE: usize = (1 << 2) | (1 << 1); 354fda81ceSLoGin 364fda81ceSLoGin const ENTRY_FLAG_USER: usize = (1 << 4); 374fda81ceSLoGin 384fda81ceSLoGin const ENTRY_FLAG_WRITE_THROUGH: usize = (2 << 61); 394fda81ceSLoGin 404fda81ceSLoGin const ENTRY_FLAG_CACHE_DISABLE: usize = (2 << 61); 414fda81ceSLoGin 424fda81ceSLoGin const ENTRY_FLAG_NO_EXEC: usize = 0; 434fda81ceSLoGin 444fda81ceSLoGin const ENTRY_FLAG_EXEC: usize = (1 << 3); 454fda81ceSLoGin 464fda81ceSLoGin const PHYS_OFFSET: usize = 0xffff_ffc0_0000_0000; 474fda81ceSLoGin 484fda81ceSLoGin const USER_END_VADDR: crate::mm::VirtAddr = VirtAddr::new(0x0000_003f_ffff_ffff); 494fda81ceSLoGin 504fda81ceSLoGin const USER_BRK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffff_ffff); 514fda81ceSLoGin 524fda81ceSLoGin const USER_STACK_START: crate::mm::VirtAddr = VirtAddr::new(0x0000_001f_ffa0_0000); 534fda81ceSLoGin 544fda81ceSLoGin unsafe fn init() -> &'static [crate::mm::PhysMemoryArea] { 554fda81ceSLoGin todo!() 564fda81ceSLoGin } 574fda81ceSLoGin 584fda81ceSLoGin unsafe fn invalidate_page(address: crate::mm::VirtAddr) { 594fda81ceSLoGin todo!() 604fda81ceSLoGin } 614fda81ceSLoGin 624fda81ceSLoGin unsafe fn invalidate_all() { 634fda81ceSLoGin todo!() 644fda81ceSLoGin } 654fda81ceSLoGin 664fda81ceSLoGin unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr { 674fda81ceSLoGin todo!() 684fda81ceSLoGin } 694fda81ceSLoGin 704fda81ceSLoGin unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) { 714fda81ceSLoGin todo!() 724fda81ceSLoGin } 734fda81ceSLoGin 744fda81ceSLoGin fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool { 754fda81ceSLoGin todo!() 764fda81ceSLoGin } 774fda81ceSLoGin 784fda81ceSLoGin fn initial_page_table() -> crate::mm::PhysAddr { 794fda81ceSLoGin todo!() 804fda81ceSLoGin } 814fda81ceSLoGin 824fda81ceSLoGin fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, crate::syscall::SystemError> 834fda81ceSLoGin { 844fda81ceSLoGin todo!() 854fda81ceSLoGin } 864fda81ceSLoGin } 874fda81ceSLoGin 884fda81ceSLoGin /// 获取内核地址默认的页面标志 894fda81ceSLoGin pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> { 904fda81ceSLoGin unimplemented!("riscv64::kernel_page_flags") 914fda81ceSLoGin } 924fda81ceSLoGin 934fda81ceSLoGin /// 全局的页帧分配器 944fda81ceSLoGin #[derive(Debug, Clone, Copy, Hash)] 954fda81ceSLoGin pub struct LockedFrameAllocator; 964fda81ceSLoGin 974fda81ceSLoGin impl FrameAllocator for LockedFrameAllocator { 984fda81ceSLoGin unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> { 994fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::allocate") 1004fda81ceSLoGin } 1014fda81ceSLoGin 1024fda81ceSLoGin unsafe fn free(&mut self, address: crate::mm::PhysAddr, count: PageFrameCount) { 1034fda81ceSLoGin assert!(count.data().is_power_of_two()); 1044fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::free") 1054fda81ceSLoGin } 1064fda81ceSLoGin 1074fda81ceSLoGin unsafe fn usage(&self) -> PageFrameUsage { 1084fda81ceSLoGin unimplemented!("RiscV64 LockedFrameAllocator::usage") 1094fda81ceSLoGin } 1104fda81ceSLoGin } 111