mod.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. pub mod bump;
  2. use crate::mm::{
  3. allocator::page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage},
  4. page::EntryFlags,
  5. MemoryManagementArch, PhysAddr, VirtAddr, VmFlags,
  6. };
  7. use crate::arch::MMArch;
  8. pub type PageMapper = crate::mm::page::PageMapper<LoongArch64MMArch, LockedFrameAllocator>;
  9. /// LoongArch64的内存管理架构结构体
  10. #[derive(Debug, Clone, Copy, Hash)]
  11. pub struct LoongArch64MMArch;
  12. impl MemoryManagementArch for LoongArch64MMArch {
  13. const PAGE_FAULT_ENABLED: bool = false;
  14. const PAGE_SHIFT: usize = 0;
  15. const PAGE_ENTRY_SHIFT: usize = 0;
  16. const PAGE_LEVELS: usize = 0;
  17. const ENTRY_ADDRESS_SHIFT: usize = 0;
  18. const ENTRY_FLAG_DEFAULT_PAGE: usize = 0;
  19. const ENTRY_FLAG_DEFAULT_TABLE: usize = 0;
  20. const ENTRY_FLAG_PRESENT: usize = 0;
  21. const ENTRY_FLAG_READONLY: usize = 0;
  22. const ENTRY_FLAG_WRITEABLE: usize = 0;
  23. const ENTRY_FLAG_READWRITE: usize = 0;
  24. const ENTRY_FLAG_USER: usize = 0;
  25. const ENTRY_FLAG_WRITE_THROUGH: usize = 0;
  26. const ENTRY_FLAG_CACHE_DISABLE: usize = 0;
  27. const ENTRY_FLAG_NO_EXEC: usize = 0;
  28. const ENTRY_FLAG_EXEC: usize = 0;
  29. const ENTRY_FLAG_DIRTY: usize = 0;
  30. const ENTRY_FLAG_ACCESSED: usize = 0;
  31. const ENTRY_FLAG_HUGE_PAGE: usize = 0;
  32. const ENTRY_FLAG_GLOBAL: usize = 0;
  33. const PHYS_OFFSET: usize = 0x9000_0000_0000_0000;
  34. const KERNEL_LINK_OFFSET: usize = 0;
  35. const USER_END_VADDR: crate::mm::VirtAddr = VirtAddr::new(0);
  36. const USER_BRK_START: crate::mm::VirtAddr = VirtAddr::new(0);
  37. const USER_STACK_START: crate::mm::VirtAddr = VirtAddr::new(0);
  38. const FIXMAP_START_VADDR: crate::mm::VirtAddr = VirtAddr::new(0);
  39. const FIXMAP_SIZE: usize = 0;
  40. const MMIO_BASE: crate::mm::VirtAddr = VirtAddr::new(0);
  41. const MMIO_SIZE: usize = 0;
  42. const PAGE_NONE: usize = 0;
  43. const PAGE_SHARED: usize = 0;
  44. const PAGE_SHARED_EXEC: usize = 0;
  45. const PAGE_COPY_NOEXEC: usize = 0;
  46. const PAGE_COPY_EXEC: usize = 0;
  47. const PAGE_COPY: usize = 0;
  48. const PAGE_READONLY: usize = 0;
  49. const PAGE_READONLY_EXEC: usize = 0;
  50. const PAGE_READ: usize = 0;
  51. const PAGE_READ_EXEC: usize = 0;
  52. const PAGE_WRITE: usize = 0;
  53. const PAGE_WRITE_EXEC: usize = 0;
  54. const PAGE_EXEC: usize = 0;
  55. const PROTECTION_MAP: [crate::mm::page::EntryFlags<Self>; 16] = protection_map();
  56. unsafe fn init() {
  57. todo!()
  58. }
  59. unsafe fn invalidate_page(address: crate::mm::VirtAddr) {
  60. todo!()
  61. }
  62. unsafe fn invalidate_all() {
  63. todo!()
  64. }
  65. unsafe fn table(table_kind: crate::mm::PageTableKind) -> crate::mm::PhysAddr {
  66. todo!()
  67. }
  68. unsafe fn set_table(table_kind: crate::mm::PageTableKind, table: crate::mm::PhysAddr) {
  69. todo!()
  70. }
  71. fn virt_is_valid(virt: crate::mm::VirtAddr) -> bool {
  72. todo!()
  73. }
  74. fn initial_page_table() -> crate::mm::PhysAddr {
  75. todo!()
  76. }
  77. fn setup_new_usermapper() -> Result<crate::mm::ucontext::UserMapper, system_error::SystemError>
  78. {
  79. todo!()
  80. }
  81. fn make_entry(paddr: crate::mm::PhysAddr, page_flags: usize) -> usize {
  82. todo!()
  83. }
  84. }
  85. /// 获取内核地址默认的页面标志
  86. pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(_virt: VirtAddr) -> EntryFlags<A> {
  87. EntryFlags::from_data(LoongArch64MMArch::ENTRY_FLAG_DEFAULT_PAGE)
  88. .set_user(false)
  89. .set_execute(true)
  90. }
  91. /// 全局的页帧分配器
  92. #[derive(Debug, Clone, Copy, Hash)]
  93. pub struct LockedFrameAllocator;
  94. impl FrameAllocator for LockedFrameAllocator {
  95. unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> {
  96. todo!("LockedFrameAllocator::allocate")
  97. }
  98. unsafe fn free(&mut self, address: PhysAddr, count: PageFrameCount) {
  99. todo!("LockedFrameAllocator::free")
  100. }
  101. unsafe fn usage(&self) -> PageFrameUsage {
  102. todo!("LockedFrameAllocator::usage")
  103. }
  104. }
  105. /// 获取保护标志的映射表
  106. ///
  107. ///
  108. /// ## 返回值
  109. /// - `[usize; 16]`: 长度为16的映射表
  110. const fn protection_map() -> [EntryFlags<MMArch>; 16] {
  111. let mut map = [unsafe { EntryFlags::from_data(0) }; 16];
  112. unsafe {
  113. map[VmFlags::VM_NONE.bits()] = EntryFlags::from_data(MMArch::PAGE_NONE);
  114. map[VmFlags::VM_READ.bits()] = EntryFlags::from_data(MMArch::PAGE_READONLY);
  115. map[VmFlags::VM_WRITE.bits()] = EntryFlags::from_data(MMArch::PAGE_COPY);
  116. map[VmFlags::VM_WRITE.bits() | VmFlags::VM_READ.bits()] =
  117. EntryFlags::from_data(MMArch::PAGE_COPY);
  118. map[VmFlags::VM_EXEC.bits()] = EntryFlags::from_data(MMArch::PAGE_READONLY_EXEC);
  119. map[VmFlags::VM_EXEC.bits() | VmFlags::VM_READ.bits()] =
  120. EntryFlags::from_data(MMArch::PAGE_READONLY_EXEC);
  121. map[VmFlags::VM_EXEC.bits() | VmFlags::VM_WRITE.bits()] =
  122. EntryFlags::from_data(MMArch::PAGE_COPY_EXEC);
  123. map[VmFlags::VM_EXEC.bits() | VmFlags::VM_WRITE.bits() | VmFlags::VM_READ.bits()] =
  124. EntryFlags::from_data(MMArch::PAGE_COPY_EXEC);
  125. map[VmFlags::VM_SHARED.bits()] = EntryFlags::from_data(MMArch::PAGE_NONE);
  126. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_READ.bits()] =
  127. EntryFlags::from_data(MMArch::PAGE_READONLY);
  128. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_WRITE.bits()] =
  129. EntryFlags::from_data(MMArch::PAGE_SHARED);
  130. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_WRITE.bits() | VmFlags::VM_READ.bits()] =
  131. EntryFlags::from_data(MMArch::PAGE_SHARED);
  132. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_EXEC.bits()] =
  133. EntryFlags::from_data(MMArch::PAGE_READONLY_EXEC);
  134. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_EXEC.bits() | VmFlags::VM_READ.bits()] =
  135. EntryFlags::from_data(MMArch::PAGE_READONLY_EXEC);
  136. map[VmFlags::VM_SHARED.bits() | VmFlags::VM_EXEC.bits() | VmFlags::VM_WRITE.bits()] =
  137. EntryFlags::from_data(MMArch::PAGE_SHARED_EXEC);
  138. map[VmFlags::VM_SHARED.bits()
  139. | VmFlags::VM_EXEC.bits()
  140. | VmFlags::VM_WRITE.bits()
  141. | VmFlags::VM_READ.bits()] = EntryFlags::from_data(MMArch::PAGE_SHARED_EXEC);
  142. }
  143. map
  144. }