page_frame.rs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. use core::{
  2. intrinsics::unlikely,
  3. ops::{Add, AddAssign, Mul, Sub, SubAssign},
  4. };
  5. use crate::{
  6. arch::{mm::LockedFrameAllocator, MMArch},
  7. ipc::shm::shm_manager_lock,
  8. libs::spinlock::SpinLockGuard,
  9. mm::{MemoryManagementArch, PhysAddr, VirtAddr},
  10. };
  11. /// @brief 物理页帧的表示
  12. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
  13. pub struct PhysPageFrame {
  14. /// 物理页页号
  15. number: usize,
  16. }
  17. #[allow(dead_code)]
  18. impl PhysPageFrame {
  19. pub fn new(paddr: PhysAddr) -> Self {
  20. return Self {
  21. number: paddr.data() >> MMArch::PAGE_SHIFT,
  22. };
  23. }
  24. /// 从物理页号创建PhysPageFrame结构体
  25. pub fn from_ppn(ppn: usize) -> Self {
  26. return Self { number: ppn };
  27. }
  28. /// 获取当前页对应的物理页号
  29. pub fn ppn(&self) -> usize {
  30. return self.number;
  31. }
  32. /// @brief 获取当前页对应的物理地址
  33. pub fn phys_address(&self) -> PhysAddr {
  34. return PhysAddr::new(self.number * MMArch::PAGE_SIZE);
  35. }
  36. pub fn next_by(&self, n: usize) -> Self {
  37. return Self {
  38. number: self.number + n,
  39. };
  40. }
  41. pub fn next(&self) -> Self {
  42. return self.next_by(1);
  43. }
  44. /// 构造物理页帧的迭代器,范围为[start, end)
  45. pub fn iter_range(start: Self, end: Self) -> PhysPageFrameIter {
  46. return PhysPageFrameIter::new(start, end);
  47. }
  48. }
  49. /// @brief 物理页帧的迭代器
  50. #[derive(Debug)]
  51. pub struct PhysPageFrameIter {
  52. current: PhysPageFrame,
  53. /// 结束的物理页帧(不包含)
  54. end: PhysPageFrame,
  55. }
  56. impl PhysPageFrameIter {
  57. pub fn new(start: PhysPageFrame, end: PhysPageFrame) -> Self {
  58. return Self {
  59. current: start,
  60. end,
  61. };
  62. }
  63. }
  64. impl Iterator for PhysPageFrameIter {
  65. type Item = PhysPageFrame;
  66. fn next(&mut self) -> Option<Self::Item> {
  67. if unlikely(self.current == self.end) {
  68. return None;
  69. }
  70. let current: PhysPageFrame = self.current;
  71. self.current = self.current.next_by(1);
  72. return Some(current);
  73. }
  74. }
  75. /// 虚拟页帧的表示
  76. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
  77. pub struct VirtPageFrame {
  78. /// 虚拟页页号
  79. number: usize,
  80. }
  81. impl VirtPageFrame {
  82. pub fn new(vaddr: VirtAddr) -> Self {
  83. return Self {
  84. number: vaddr.data() / MMArch::PAGE_SIZE,
  85. };
  86. }
  87. /// 从虚拟页号创建PhysPageFrame结构体
  88. #[allow(dead_code)]
  89. pub fn from_vpn(vpn: usize) -> Self {
  90. return Self { number: vpn };
  91. }
  92. /// 获取当前虚拟页对应的虚拟地址
  93. pub fn virt_address(&self) -> VirtAddr {
  94. return VirtAddr::new(self.number * MMArch::PAGE_SIZE);
  95. }
  96. pub fn next_by(&self, n: usize) -> Self {
  97. return Self {
  98. number: self.number + n,
  99. };
  100. }
  101. pub fn next(&self) -> Self {
  102. return self.next_by(1);
  103. }
  104. /// 构造虚拟页帧的迭代器,范围为[start, end)
  105. pub fn iter_range(start: Self, end: Self) -> VirtPageFrameIter {
  106. return VirtPageFrameIter {
  107. current: start,
  108. end,
  109. };
  110. }
  111. pub fn add(&self, n: PageFrameCount) -> Self {
  112. return Self {
  113. number: self.number + n.data(),
  114. };
  115. }
  116. }
  117. /// 虚拟页帧的迭代器
  118. #[derive(Debug)]
  119. pub struct VirtPageFrameIter {
  120. current: VirtPageFrame,
  121. /// 结束的虚拟页帧(不包含)
  122. end: VirtPageFrame,
  123. }
  124. impl VirtPageFrameIter {
  125. /// @brief 构造虚拟页帧的迭代器,范围为[start, end)
  126. pub fn new(start: VirtPageFrame, end: VirtPageFrame) -> Self {
  127. return Self {
  128. current: start,
  129. end,
  130. };
  131. }
  132. }
  133. impl Iterator for VirtPageFrameIter {
  134. type Item = VirtPageFrame;
  135. fn next(&mut self) -> Option<Self::Item> {
  136. if unlikely(self.current == self.end) {
  137. return None;
  138. }
  139. let current: VirtPageFrame = self.current;
  140. self.current = self.current.next_by(1);
  141. return Some(current);
  142. }
  143. }
  144. /// 页帧使用的数量
  145. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
  146. #[repr(transparent)]
  147. pub struct PageFrameCount(usize);
  148. impl PageFrameCount {
  149. // @brief 初始化PageFrameCount
  150. pub const fn new(count: usize) -> Self {
  151. return Self(count);
  152. }
  153. // @brief 获取页帧数量
  154. pub fn data(&self) -> usize {
  155. return self.0;
  156. }
  157. /// 计算这一段页帧占用的字节数
  158. pub fn bytes(&self) -> usize {
  159. return self.0 * MMArch::PAGE_SIZE;
  160. }
  161. /// 将字节数转换为页帧数量
  162. ///
  163. /// 如果字节数不是页帧大小的整数倍,则返回None. 否则返回页帧数量
  164. pub fn from_bytes(bytes: usize) -> Option<Self> {
  165. if bytes & MMArch::PAGE_OFFSET_MASK != 0 {
  166. return None;
  167. } else {
  168. return Some(Self(bytes / MMArch::PAGE_SIZE));
  169. }
  170. }
  171. #[inline(always)]
  172. pub fn next_power_of_two(&self) -> Self {
  173. Self::new(self.0.next_power_of_two())
  174. }
  175. }
  176. impl Add for PageFrameCount {
  177. type Output = Self;
  178. fn add(self, rhs: Self) -> Self::Output {
  179. return Self(self.0 + rhs.0);
  180. }
  181. }
  182. impl AddAssign for PageFrameCount {
  183. fn add_assign(&mut self, rhs: Self) {
  184. self.0 += rhs.0;
  185. }
  186. }
  187. impl Sub for PageFrameCount {
  188. type Output = Self;
  189. fn sub(self, rhs: Self) -> Self::Output {
  190. return Self(self.0 - rhs.0);
  191. }
  192. }
  193. impl SubAssign for PageFrameCount {
  194. fn sub_assign(&mut self, rhs: Self) {
  195. self.0 -= rhs.0;
  196. }
  197. }
  198. impl Mul for PageFrameCount {
  199. type Output = Self;
  200. fn mul(self, rhs: Self) -> Self::Output {
  201. return Self(self.0 * rhs.0);
  202. }
  203. }
  204. impl Add<usize> for PageFrameCount {
  205. type Output = Self;
  206. fn add(self, rhs: usize) -> Self::Output {
  207. return Self(self.0 + rhs);
  208. }
  209. }
  210. impl AddAssign<usize> for PageFrameCount {
  211. fn add_assign(&mut self, rhs: usize) {
  212. self.0 += rhs;
  213. }
  214. }
  215. impl Sub<usize> for PageFrameCount {
  216. type Output = Self;
  217. fn sub(self, rhs: usize) -> Self::Output {
  218. return Self(self.0 - rhs);
  219. }
  220. }
  221. impl SubAssign<usize> for PageFrameCount {
  222. fn sub_assign(&mut self, rhs: usize) {
  223. self.0 -= rhs;
  224. }
  225. }
  226. impl Mul<usize> for PageFrameCount {
  227. type Output = Self;
  228. fn mul(self, rhs: usize) -> Self::Output {
  229. return Self(self.0 * rhs);
  230. }
  231. }
  232. // 页帧使用情况
  233. #[derive(Debug)]
  234. pub struct PageFrameUsage {
  235. used: PageFrameCount,
  236. total: PageFrameCount,
  237. }
  238. #[allow(dead_code)]
  239. impl PageFrameUsage {
  240. /// @brief: 初始化FrameUsage
  241. /// @param PageFrameCount used 已使用的页帧数量
  242. /// @param PageFrameCount total 总的页帧数量
  243. pub fn new(used: PageFrameCount, total: PageFrameCount) -> Self {
  244. return Self { used, total };
  245. }
  246. // @brief 获取已使用的页帧数量
  247. pub fn used(&self) -> PageFrameCount {
  248. return self.used;
  249. }
  250. // @brief 获取空闲的页帧数量
  251. pub fn free(&self) -> PageFrameCount {
  252. return self.total - self.used;
  253. }
  254. // @brief 获取总的页帧数量
  255. pub fn total(&self) -> PageFrameCount {
  256. return self.total;
  257. }
  258. }
  259. /// 能够分配页帧的分配器需要实现的trait
  260. pub trait FrameAllocator {
  261. // @brief 分配count个页帧
  262. unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)>;
  263. // @brief 通过地址释放count个页帧
  264. unsafe fn free(&mut self, address: PhysAddr, count: PageFrameCount);
  265. // @brief 分配一个页帧
  266. unsafe fn allocate_one(&mut self) -> Option<PhysAddr> {
  267. return self.allocate(PageFrameCount::new(1)).map(|(addr, _)| addr);
  268. }
  269. // @brief 通过地址释放一个页帧
  270. unsafe fn free_one(&mut self, address: PhysAddr) {
  271. return self.free(address, PageFrameCount::new(1));
  272. }
  273. // @brief 获取页帧使用情况
  274. unsafe fn usage(&self) -> PageFrameUsage;
  275. }
  276. /// @brief 通过一个 &mut T 的引用来对一个实现了 FrameAllocator trait 的类型进行调用,使代码更加灵活
  277. impl<T: FrameAllocator> FrameAllocator for &mut T {
  278. unsafe fn allocate(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> {
  279. return T::allocate(self, count);
  280. }
  281. unsafe fn free(&mut self, address: PhysAddr, count: PageFrameCount) {
  282. return T::free(self, address, count);
  283. }
  284. unsafe fn allocate_one(&mut self) -> Option<PhysAddr> {
  285. return T::allocate_one(self);
  286. }
  287. unsafe fn free_one(&mut self, address: PhysAddr) {
  288. return T::free_one(self, address);
  289. }
  290. unsafe fn usage(&self) -> PageFrameUsage {
  291. return T::usage(self);
  292. }
  293. }
  294. /// @brief 从全局的页帧分配器中分配连续count个页帧
  295. ///
  296. /// @param count 请求分配的页帧数量
  297. pub unsafe fn allocate_page_frames(count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> {
  298. let frame = unsafe { LockedFrameAllocator.allocate(count)? };
  299. return Some(frame);
  300. }
  301. /// @brief 向全局页帧分配器释放连续count个页帧
  302. ///
  303. /// @param frame 要释放的第一个页帧
  304. /// @param count 要释放的页帧数量 (必须是2的n次幂)
  305. pub unsafe fn deallocate_page_frames(
  306. frame: PhysPageFrame,
  307. count: PageFrameCount,
  308. page_manager_guard: &mut SpinLockGuard<'_, crate::mm::page::PageManager>,
  309. ) {
  310. unsafe {
  311. LockedFrameAllocator.free(frame.phys_address(), count);
  312. }
  313. let mut frame = frame;
  314. for _ in 0..count.data() {
  315. let paddr = frame.phys_address();
  316. let page = page_manager_guard.get(&paddr);
  317. if let Some(page) = page {
  318. // 如果page是共享页,将其共享页信息从SHM_MANAGER中删去
  319. let page_guard = page.read_irqsave();
  320. if page_guard.shared() {
  321. shm_manager_lock().free_id(&page_guard.shm_id().unwrap());
  322. }
  323. }
  324. // 将已回收的物理页面对应的Page从PAGE_MANAGER中删去
  325. page_manager_guard.remove_page(&paddr);
  326. frame = frame.next();
  327. }
  328. }