- // TODO: Add kernel reserved memory page check
- uint32_t pg = (uintptr_t)page >> 12;
- if (pg && pg < max_pg)
- {
- pmm_mark_page_free(pg);
- return 1;
+ struct pp_struct* pm = &pm_table[(intptr_t)page >> 12];
+
+ // Is this a MMIO mapping or double free?
+ if (((intptr_t)page >> 12) >= max_pg || !(pm->ref_counts)) {
+ return 0;
+ }
+
+ // 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;