Skip to content

内存管理函数概述

Yradex edited this page Jun 26, 2016 · 2 revisions

本文概述操作系统的内存管理函数。

该部分定义在 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) 查找一个虚地址所对应的页表项

函数信息

void bcopy (const void *src, void *dst, size_t len)

简述

将一段内存中的数据复制到另一段内存中。

参数
  • const void *src

    复制的源地址。

  • void *dst

    复制的目标地址。

  • size_t len

    要复制的内存长度,单位是字节。

返回值

void bzero (void *b, size_t len)

简述

将一段内存清空。清空后其内容为 0。

参数
  • void *b

    清空的首地址。

  • size_t len

    要清空的内存长度,单位是字节。

返回值

int page_alloc (struct Page **pp)

简述

从物理内存中分配一个页。分配所得页面对应的内存数据全为 0。

参数
  • struct Page **pp

    一个页面指针的地址,用于返回分配所得的页面指针。

返回值

如果页面分配成功,返回 0。 如果没有可供分配的页,返回 -E_NO_MEM。

额外信息

该函数的每次调用都会从 page_free_list 列表中提取一个页面并从中删除,将其清空,并返回其指针。

void page_decref (struct Page *pp)

简述

减少一个页面的使用计数。如果其引用计数为 0 或在减少后其引用计数为 0,将该页面释放。

参数
  • struct Page *pp

    要减少使用计数的页面。

返回值

额外信息

该函数在释放页面时会调用 page_free 函数。该函数简单地将页面加回到 page_free_list 列表中。

void page_init ()

简述

建立页面机制。这个函数必须在使用页面机制前调用。

参数

返回值

额外信息

该函数首先取得操作系统在初始化后剩余可分配内存的首地址,将操作系统已经占用的物理页面标记为不可分配的,然后建立 page_free_list 列表,将所有可分配页面加入其中。

int page_insert (Pte *pgdir, struct Page *pp, u_long va, u_int perm)

简述

将一个页面映射到指定虚地址。如果虚地址已经挂载了其他页面,将其替换为该页面。映射完后,可以使用虚地址访问该页面中的数据。

参数
  • Pte *pgdir

    页目录的地址。

  • struct Page *pp

    需要映射的页面。

  • u_long va

    需要映射到的虚地址。

  • u_int perm

    页面映射时的权限位。

返回值

如果该页面被成功映射到指定虚地址,返回 0。 如果映射失败,返回 -E_NO_MEM。

struct Page * page_lookup (Pte *pgdir, u_long va, Pte **ppte)

简述

查找并返回一个虚地址所对应的页面。

参数
  • Pte *pgdir

    页目录的地址。

  • u_long va

    查找所依据的虚地址。

  • Pte **ppte

    一个页表项的地址,用于返回查询所得的页表项。该参数可以为 NULL,在这种情况下该项不会用于返回。

返回值

指定虚地址所对应的页面。如果该虚地址没有对应的页面,将返回 NULL。

额外信息

该函数实际调用 pgdir_walk 函数完成查询操作。

void page_remove (Pte *pgdir, u_long va)

简述

解除一个页面和虚地址的对应关系。

参数
  • Pte *pgdir

    页目录的地址。

  • u_long va

    需要解除映射关系的虚地址。

返回值

int pgdir_walk(Pte *pgdir, u_long va, int create, Pte **ppte)

简述

查找一个虚地址所对应的页表项。

参数
  • Pte *pgdir

    页目录的地址。

  • u_long va

    查找所依据的虚地址。

  • int create

    决定函数在找不到对应页表项时的表现。如果该项为 0,函数会简单地将 ppte 赋为 NULL。如果该项不为 0,函数将新建该虚地址对应的页表项,并将其作为查询结果。

  • Pte **ppte

    一个页表项的地址,用于返回查询所得的页表项。

返回值

如果函数正常结束,返回0。 如果函数在需要时无法新建虚地址对应的页表项,返回 -E_NO_MEM。

Clone this wiki locally