/******************************************** *Created By: 陶治江 *Date: 2009-3-16 ********************************************/ //呃,虚拟内存管理器,是用来为内核进行大内存块的分配的 //是用来对高端内存进行操作的方法 #include #include #include #include #include #include #include #include #include #include struct vm_struct { unsigned long flags; void * addr; unsigned long size...
by taozhijiangscu - Linux文档专区 - 2009-03-20 22:49:02 阅读(649) 回复(0)
说句废话,vmalloc是内核态为进程分配页面的函数接口,用来分配虚拟内存连续的页面,但这些页面在物理内存中是不一定连续的,即便用户通过vmalloc拿到了虚拟内存,也不一定能拿到物理内存,这个就不用多说了,这也是为什么操作系统要引入虚拟内存的原因。 vmalloc和kmalloc的有个最大的不同,kmalloc分配一段连续的物理内存区域,它和线性地址之间有个简单的映射关系,也就是说当你拿到虚拟内存的时候你也拿到了物理内存,...
内核( 在 x86 体系上, 在缺省配置里) 在用户空间和内核之间划分 4-G 虚拟地址; 在 2 个上下文中使用同一套映射. 一个 典型的划分分出 3 GB 给用户空间, 和 1 GB 给内核空间 一个真正的内核虚拟地址, 是一个由诸如 vmalloc 的函数返回的地址 -- 就是, 一个映射到内核页表中的虚拟地址。。这句话是LDD3上的原话, 没看懂 3G到4G这个地址不是内核虚拟地址么 vmalloc函数的调用是怎么回事啊,它得到的不是虚拟地址么,它返回的地...
this just quota 1 . vmalloc can't be used in interrupt, also can't be used in lock. please care it. 2 . Not lock-context but interrupt-context which includes soft-interrupt and hard-interrupt. It is advised that not use them in atomic-context. In another word, it can only be used in process-context. As write_lock_bh disables the soft-interrupt, itself become in soft-interrupt context. To...
系统跑就了,vmalloc内存碎片很多,最大块只有40M左右。 想分配60M就不行了。 但vmalloc剩余还有300M。 有没有办法整理下碎片?
三:vmalloc的实现: void *vmalloc(unsigned long size) { return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL); } 实际上调用__vmalloc: void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot) { struct vm_struct *area; struct page **pages; unsigned int nr_pages, array_size, i; //使请求的大小与页框对齐 size = PAGE_ALIGN(size); //有效性检查 i...
前面我们已经分析了linux如何利用伙伴系统,slab分配器分配内存,用这些方法得到的内存在物理地址上都是连续的,然而,有些时候,每次请求内存时,系统都分配物理地址连续的内存块是不合适的,可以利用小块内存“连接”成大块可使用的内存.这在操作系统设计中也被称为 “内存拼接”,显然,内存拼接在需要较大内存,而内存访问相比之下不是很频繁的情况下是比较有效的. 在linux内核中用来管理内存拼接的接口是vmalloc/vfree.用vmalloc分...
前面我们已经分析了linux如何利用伙伴系统,slab分配器分配内存,用这些方法得到的内存在物理地址上都是连续的,然而,有些时候,每次请求内存时,系统都分配物理地址连续的内存块是不合适的,可以利用小块内存“连接”成大块可使用的内存.这在操作系统设计中也被称为 “内存拼接”,显然,内存拼接在需要较大内存,而内存访问相比之下不是很频繁的情况下是比较有效的. 在linux内核中用来管理内存拼接的接口是vmalloc/vfree.用vmallo...
三:vmalloc的实现: void *vmalloc(unsigned long size) { return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL); } 实际上调用__vmalloc: void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot) { struct vm_struct *area; struct page **pages; unsigned int nr_pages, array_size, i; //使请求的大小与页框对齐 size = PAGE_ALIGN(size); //有效性检查 ...
------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ ------------------------------------------ 前面我们已经分析了linux如何利用伙伴系统,slab分配器分配内存,用这些方法得到的内存在物理地址上都是连续的,然而,有些时候,每次请求内存时,系统都分配物理地址连续的内存块是不合适的,可以利用小块内存“连接”成大块可使用的内存.这在操作系统设计中也被称为 “内...