### `struct Page *alloc_pages(unsigned int zone_select, int num, ul flags)`
#### 描述
  从物理页管理单元中申请一段连续的物理页
#### 参数
**zone_select**
  要申请的物理页所位于的内存区域
可选值:
-`ZONE_DMA` DMA映射专用区域
-`ZONE_NORMAL` 正常的物理内存区域,已在页表高地址处映射
-`ZONE_UNMAPPED_IN_PGT` 尚未在页表中映射的区域
**num**
  要申请的连续物理页的数目,该值应当小于64
**flags**
  分配的页面要被设置成的属性
可选值:
-`PAGE_PGT_MAPPED` 页面在页表中已被映射
-`PAGE_KERNEL_INIT` 内核初始化所占用的页
-`PAGE_DEVICE` 设备MMIO映射的内存
-`PAGE_KERNEL` 内核层页
-`PAGE_SHARED` 共享页
#### 返回值
##### 成功
  成功申请则返回指向起始页面的Page结构体的指针
##### 失败
  当ZONE错误或内存不足时,返回`NULL`
### `void free_pages(struct Page *page, int number)`
#### 描述
  从物理页管理单元中释放一段连续的物理页。
#### 参数
**page**
  要释放的第一个物理页的Page结构体
**number**
  要释放的连续内存页的数量。该值应小于64
## 页表管理
### `int mm_map_phys_addr(ul virt_addr_start, ul phys_addr_start, ul length, ul flags, bool use4k)`
#### 描述
  将一段物理地址映射到当前页表的指定虚拟地址处
#### 参数
**virt_addr_start**
  虚拟地址的起始地址
**phys_addr_start**
  物理地址的起始地址
**length**
  要映射的地址空间的长度
**flags**
  页表项的属性
**use4k**
  使用4级页表,将地址区域映射为若干4K页
### `int mm_map_proc_page_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_start, ul phys_addr_start, ul length, ul flags, bool user, bool flush, bool use4k)`
#### 描述
  将一段物理地址映射到指定页表的指定虚拟地址处
#### 参数
**proc_page_table_addr**
  指定的顶层页表的起始地址
**is_phys**
  该顶层页表地址是否为物理地址
**virt_addr_start**
  虚拟地址的起始地址
**phys_addr_start**
  物理地址的起始地址
**length**
  要映射的地址空间的长度
**flags**
  页表项的属性
**user**
  页面是否为用户态可访问
**flush**
  完成映射后,是否刷新TLB
**use4k**
  使用4级页表,将地址区域映射为若干4K页
#### 返回值
- 映射成功:0
- 映射失败:-EFAULT
### `void mm_unmap_proc_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_start, ul length)`