+
+ // TODO: 检查权限,保证:1) 只有正在使用该页(包括被分享者)的进程可以释放;
+ // 2) 内核可释放所有页。
+ pm->ref_counts--;
+ return 1;
+}
+
+int
+pmm_ref_page(pid_t owner, void* page)
+{
+ (void*)owner; // TODO: do smth with owner
+
+ uint32_t ppn = (uintptr_t)page >> 12;
+
+ if (ppn >= PM_BMP_MAX_SIZE) {
+ return 0;
+ }
+
+ struct pp_struct* pm = &pm_table[ppn];
+ if (ppn >= max_pg || !pm->ref_counts) {
+ return 0;
+ }
+
+ pm->ref_counts++;
+ return 1;
+}
+
+struct pp_struct*
+pmm_query(void* pa)
+{
+ uint32_t ppn = (uintptr_t)pa >> 12;
+
+ if (ppn >= PM_BMP_MAX_SIZE) {
+ return NULL;
+ }
+
+ return &pm_table[ppn];