Linux vmalloc的实现
内核版本:2.6.28
linux如何利用伙伴系统,slab分配器分配内存,用这些方法得到的内存在物理地址上都是连续的, 然而,有些时候,每次请求内存时,系统都分配物理地址连续的内存块是不合适的,可以利用小块内存“连接”成大块可使用的内存.这在操作系统设计中也被称为 “内存拼接”,显然,内存拼接在需要较大内存,而内存访问相比之下不是很频繁的情况下是比较有效的.
在linux内核中用来管理内存拼接的接口是vmalloc/vfree.用vmalloc分配得到的内存在线性地址是平滑的,但是物理地址上是非连续的.
函数vmalloc列出如下:(mm/vmalloc.c)
size: 分配的虚拟空间的大小.
gfp_mask: 页级分配器的标志.
prot: 已分配的保护掩码.
void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)
{
return __vmalloc_node(size, gfp_mask, prot, -1,
__builtin_return_address(0));
}
函数_vmalloc分配足够的页数与size相配,把它们映射进连续的内核虚拟空间,但分配的内存块不一定连续.在函数中第一步是在vmlist中寻找到一个大小合适的虚拟内存块(_get_vm_area_node(...)).
static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,
int node, void *caller)
{
struct vm_struct *area;
//检查请求分配的内存大小有没有超过最大的物理页面数。如果超过返回 0 ,表示分配失败。
size = PAGE_ALIGN(size);
//有效性检查
if (!size || (size >> PAGE_SHIFT) > num_physpages)
return NULL;
//取得一个有效的vma
area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END,
node, gfp_mask, caller);
//如果申请的无效,返回一个NULL指针
&nb
相关文档:
一、下载安装程序
1、 下载内核源码(linux-2.6.33.tar.bz2),位置:https://www.kernel.org
2、 下载最新版的module-init-tools(module-init-tools-3.8.tar.bz2)和modutils(modutils-2.4.26-1.src.rpm)的源码
位置:http://www.kernel.org/pub/linux/kernel/people/rusty/modules/
位置:http://www. ......
此文于2010-02-26被推荐到CSDN首页
如何被推荐?
最近在研究 Linux
内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux
新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线
程服务器的常用编程模型》
的一个注脚。
< type="te ......
对于这个函数,其实是很多宏定义调用的函数,其中alloc_bootmem_low_pages(x)是其中一个调用它的宏,大家可以认为这些宏只是把这个__alloc_bootmem实质性的函数进行了封装。#define alloc_bootmem_low_pages(x)相当于__alloc_bootmem((x), PAGE_SIZE, 0),就是从0地址开始的低端内存分配按页大小对齐的内存。好了,为 ......
1. 学会写简单的makefile
2. 编一应用程序,可以用makefile跑起来
3. 学会写驱动的makefile
4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出。
&n ......
Linux下加挂文件系统的小结
学习操作系统时我们都了解到文件系统是操作系统的重要组成部分之一。文件系统有很多种类型,比
windows的fat、fat32;Linux的ext、ext2或ext3;FreeBSD的ufs等等。在使用Linux的过程,也常常Linux
操作系统使用虚拟文件系统VFS,通过VFS可以直接存取其它已被内核支持的各种文件系统,用起来就 ......