linux 一个使用整页的 scull: scullp

为了真实地测试页分配, 我们已随其他例子代码发布了 scullp 模块. 它是一个简化的 scull, 就像前面介绍过的 scullc.

 

scullp 分配的内存量子是整页或者页集合: scullp_order 变量缺省是 0, 但是可以在编 译或加载时改变.

 

下列代码行显示了它如何分配内存:

 

/* Here's the allocation of a single quantum */ if (!dptr->data[s_pos])

{

dptr->data[s_pos] =

 

尽管 alloc_pages (稍后描述)应当真正地用作分配高端内存页, 由于某些理由我们直到 15 章才真正涉及.

 

(void *) get_free_pages(GFP_KERNEL, dptr->order); if (!dptr->data[s_pos])

goto nomem;

memset(dptr->data[s_pos], 0, PAGE_SIZE << dptr->order);

}

 

scullp 中释放内存的代码看来如此:

 

/* This code frees a whole quantum-set */ for (i = 0; i < qset; i++)

if (dptr->data[i])

free_pages((unsigned long)(dptr->data[i]), dptr->order);

 

在用户级别, 被感觉到的区别主要是一个速度提高和更好的内存使用, 因为没有内部的内 存碎片. 我们运行一些测试从 scull0 拷贝 4 MB 到 scull1, 并且接着从 scullp0 到 scullp1; 结果显示了在内核空间处理器使用率有轻微上升.

 

性能的提高不是激动人心的, 因为 kmalloc 被设计为快的. 页级别分配的主要优势实际 上不是速度, 而是更有效的内存使用. 按页分配不浪费内存, 而使用 kmalloc 由于分配 的粒度会浪费无法预测数量的内存.

 

但是 get_free_page 函数的最大优势是获得的页完全是你的, 并且你可以, 理论上, 可以通过适当的设置页表来组合这些页为一个线性的区域. 例如, 你可以允许一个用户进 程 mmap 作为单个不联系的页而获得的内存区. 我们在 15 章讨论这种操作, 那里我们展 示 scullp 如何提供内存映射, 一些 scull 无法提供的东西.

posted @ 2019-07-06 11:24  樊伟胜  阅读(265)  评论(0编辑  收藏  举报