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