-
Notifications
You must be signed in to change notification settings - Fork 19
内存管理函数概述
本文概述操作系统的内存管理函数。
该部分定义在 mm/pmap.c 中。
| 返回类型 | 函数 | 描述 |
|---|---|---|
| void | bcopy (const void *src, void *dst, size_t len) | 复制一段内存数据 |
| void | bzero (void *b, size_t len) | 清空一段内存 |
| int | page_alloc (struct Page **pp) | 从物理内存中分配一个页 |
| void | page_decref (struct Page *pp) | 减少一个页面的使用计数 |
| void | page_init () | 建立页面机制 |
| int | page_insert (Pte *pgdir, struct Page *pp, u_long va, u_int perm) | 将一个页面映射到指定虚地址 |
| struct Page * | page_lookup (Pte *pgdir, u_long va, Pte **ppte) | 查找一个虚地址所对应的页面 |
| void | page_remove (Pte *pgdir, u_long va) | 解除一个页面和虚地址的对应关系 |
| int | pgdir_walk (Pte *pgdir, u_long va, int create, Pte **ppte) | 查找一个虚地址所对应的页表项 |
将一段内存中的数据复制到另一段内存中。
-
const void *src复制的源地址。
-
void *dst复制的目标地址。
-
size_t len要复制的内存长度,单位是字节。
无
将一段内存清空。清空后其内容为 0。
-
void *b清空的首地址。
-
size_t len要清空的内存长度,单位是字节。
无
从物理内存中分配一个页。分配所得页面对应的内存数据全为 0。
-
struct Page **pp一个页面指针的地址,用于返回分配所得的页面指针。
如果页面分配成功,返回 0。 如果没有可供分配的页,返回 -E_NO_MEM。
该函数的每次调用都会从 page_free_list 列表中提取一个页面并从中删除,将其清空,并返回其指针。
减少一个页面的使用计数。如果其引用计数为 0 或在减少后其引用计数为 0,将该页面释放。
-
struct Page *pp要减少使用计数的页面。
无
该函数在释放页面时会调用 page_free 函数。该函数简单地将页面加回到 page_free_list 列表中。
建立页面机制。这个函数必须在使用页面机制前调用。
无
无
该函数首先取得操作系统在初始化后剩余可分配内存的首地址,将操作系统已经占用的物理页面标记为不可分配的,然后建立 page_free_list 列表,将所有可分配页面加入其中。
将一个页面映射到指定虚地址。如果虚地址已经挂载了其他页面,将其替换为该页面。映射完后,可以使用虚地址访问该页面中的数据。
-
Pte *pgdir页目录的地址。
-
struct Page *pp需要映射的页面。
-
u_long va需要映射到的虚地址。
-
u_int perm页面映射时的权限位。
如果该页面被成功映射到指定虚地址,返回 0。 如果映射失败,返回 -E_NO_MEM。
查找并返回一个虚地址所对应的页面。
-
Pte *pgdir页目录的地址。
-
u_long va查找所依据的虚地址。
-
Pte **ppte一个页表项的地址,用于返回查询所得的页表项。该参数可以为 NULL,在这种情况下该项不会用于返回。
指定虚地址所对应的页面。如果该虚地址没有对应的页面,将返回 NULL。
该函数实际调用 pgdir_walk 函数完成查询操作。
解除一个页面和虚地址的对应关系。
-
Pte *pgdir页目录的地址。
-
u_long va需要解除映射关系的虚地址。
无
查找一个虚地址所对应的页表项。
-
Pte *pgdir页目录的地址。
-
u_long va查找所依据的虚地址。
-
int create决定函数在找不到对应页表项时的表现。如果该项为 0,函数会简单地将 ppte 赋为 NULL。如果该项不为 0,函数将新建该虚地址对应的页表项,并将其作为查询结果。
-
Pte **ppte一个页表项的地址,用于返回查询所得的页表项。
如果函数正常结束,返回0。 如果函数在需要时无法新建虚地址对应的页表项,返回 -E_NO_MEM。