Kmalloc/vmalloc/malloc

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还可以处理交换空 间。

你可能感兴趣的:(操作系统)