内存管理API
SLAB内存池
SLAB内存池提供小内存对象的分配功能。
void *kmalloc(unsigned long size, gfp_t gfp)
获取小块的内存。
void *kzalloc(unsigned long size, gfp_t gfp)
物理页管理
DragonOS支持对物理页的直接操作
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
共享页
页表管理
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