1、vmalloc和vfree是内核下面申请和释放内存的函数。申请到的内存虚拟地址连续,但是物理地址可能不连续,且按照4K方式对齐。
2、vmalloc最大分配的空间大小(cat /proc/meminfo | grep Vmalloc)查看。最大不可能操作改值
3、假如vmalloc申请一个特别大的空间,即超过了上面的阈值,设备无法申请成功
4、根据上面的错误信息可以确认报错的地方
static struct vmap_area *alloc_vmap_area(unsigned long size,
unsigned long align,
unsigned long vstart, unsigned long vend,
int node, gfp_t gfp_mask)
又是通过下面这个函数决定
static __always_inline unsigned long
__alloc_vmap_area(unsigned long size, unsigned long align,
unsigned long vstart, unsigned long vend)
最终可以确定vmalloc分配的空间必须介于这两个宏(32bit 系统)之间
#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
#define VMALLOC_END 0xff800000UL
其中
#define VMALLOC_OFFSET (8*1024*1024)
由此可见,vmallo分配的大小取决于high_memory大小,值越小,可分配的空间越大。如
lowmem空间越小,vmalloc空间就可以越大。因为结束地址已经固定。
5、vmalloc分配成功,返回的地址也在这个区间之间
6、查看当前系统vmalloc分配的详细信息(cat /proc/vmallocinfo)