kmalloc,vmalloc都基于slab实现
区别:
1.分配的位置:
kmalloc:分配的内存为内核区的ZONE_NORMOL区,该区的大小在3G+16-896区间内,大小有限不适合开辟太大的空间
vmalloc:分配的是ZONE_HIGHMEM高端内存区也就是非连续内存区。
malloc:分配的是用户空间的堆区数据
kmalloc和vmalloc是分配的是内核的内存
malloc分配的是用户的内存
2.分配是否连续:
kmalloc保证分配的内存在物理上是连续的,虚拟地址自然也是连续的
vmalloc保证的是在虚拟地址空间上的连续,物理空间不一定连续,它通过分配非连续的物理内存块,在修正页表,把内存映射到逻辑地址空间的连续区域中
malloc
3.适用情况:
kmalloc能分配的大小有限,①内核代码大都需要用kmalloc开获取内存而非vmalloc(因为vmalloc为了把物理内存上不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表项,并一个一个的映射,这就会导致比直接内存映射大得多的消耗)②内存只有在要被DMA访
kmalloc,vmalloc都基于slab实现
区别:
1.分配的位置:
kmalloc:分配的内存为内核区的ZONE_NORMOL区,该区的大小在3G+16-896区间内,大小有限不适合开辟太大的空间
vmalloc:分配的是ZONE_HIGHMEM高端内存区也就是非连续内存区。
malloc:分配的是用户空间的堆区数据
kmalloc和vmalloc是分配的是内核的内存
malloc分配的是用户的内存
2.分配是否连续:
kmalloc保证分配的内存在物理上是连续的,虚拟地址自然也是连续的
vmalloc保证的是在虚拟地址空间上的连续,物理空间不一定连续,它通过分配非连续的物理内存块,在修正页表,把内存映射到逻辑地址空间的连续区域中
malloc
3.适用情况:
kmalloc能分配的大小有限,①内核代码大都需要用kmalloc开获取内存而非vmalloc(因为vmalloc为了把物理内存上不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表项,并一个一个的映射,这就会导致比直接内存映射大得多的消耗)②内存只有在要被DMA访问的时候才需要物理上连续
vmalloc和malloc能分配的大小相对较大
vmalloc比kmalloc要慢,vmalloc 在ZONE_HIGHMEM区,分配大内存块,物理地址不连续,适合对地址连续无要求的场合 因为虚拟地址更新页表,故效率较低
kmalloc 通常在ZONE_NORMOL 适合分配内存大小小于页框的场合 不会触发页表更新,分配效率高
详细:
1.kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配
vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配
2.
kmalloc和 kfree管理内核段内分配的内存,这是真实地址已知的实际物理内存块。vmalloc和vfree是对内核使用的虚拟内存进行分配和释放。 kmalloc返回的内存是物理的,连续的,更适合于类似设备驱动的程序来使用。但vmalloc能使用更多的资源,因为vmalloc还可以处理交换空 间。
问的时候才需要物理上连续
vmalloc和malloc能分配的大小相对较大
vmalloc比kmalloc要慢,vmalloc 在ZONE_HIGHMEM区,分配大内存块,物理地址不连续,适合对地址连续无要求的场合 因为虚拟地址更新页表,故效率较低
kmalloc 通常在ZONE_NORMOL 适合分配内存大小小于页框的场合 不会触发页表更新,分配效率高
详细:
1.kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配
vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配
2.
kmalloc和 kfree管理内核段内分配的内存,这是真实地址已知的实际物理内存块。vmalloc和vfree是对内核使用的虚拟内存进行分配和释放。 kmalloc返回的内存是物理的,连续的,更适合于类似设备驱动的程序来使用。但vmalloc能使用更多的资源,因为vmalloc还可以处理交换空 间。