动易网站管理系统下载,云小店自助下单,wordpress文艺主题,wordpress 刷单kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数 malloc是用户空间申请内存函数 一 #xff0c;kmalloc() 与 kfree() 和get_free_page的区别 1,用于申请较小的、连续的物理内存#xff1a;使用的是内存分配器slab一小片。申请的内存位于物理内存… kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数 malloc是用户空间申请内存函数 一 kmalloc() 与 kfree() 和get_free_page的区别 1,用于申请较小的、连续的物理内存使用的是内存分配器slab一小片。申请的内存位于物理内存的映射区域。其正真的物理地址只相差一个固定的偏移。 可以用这两个宏来简单转换 __pa(address) virt_to_phys() 和 __va(address)phys_to_virt() get_free_page()申请的内存是一整页一页的大小一般是128K。它们的区别只有这一点不同其它的都相同。 本质上讲kmalloc()和get_free_page()最终调用实现都是相同的只不过在调用最终函数时所传的flag不同而以。 2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上也是连续 3. gfp_mask标志 情形 相应标志 进程上下文可以睡眠 GFP_KERNEL 进程上下文不可以睡眠 GFP_ATOMIC 中断处理程序 GFP_ATOMIC 软中断 GFP_ATOMIC Tasklet GFP_ATOMIC 用于DMA的内存可以睡眠 GFP_DMA | GFP_KERNEL 用于DMA的内存不可以睡眠 GFP_DMA | GFP_ATOMIC 4. void kfree(const void *ptr) 释放由kmalloc()分配出来的内存块二vmalloc() 与 vfree() 用于申请较大的内存空间虚拟内存是连续的申请内存位于vmalloc_start -----vmalloc_end之间与物理内存没有简单的转换关系。物理上不要求连续。 1. 以字节为单位进行分配在linux/vmalloc.h中 2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续物理地址不连续 3. 一般情况下只有硬件设备才需要物理地址连续的内存因为硬件设备往往存在于MMU之外根本不了解虚拟地址但为了性能上的考虑内核中一般使用kmalloc()而只有在需要获得大块内存时才使用vmalloc()例如当模块被动态加载到内核当中时就把模块装载到由vmalloc()分配的内存上。 4.void vfree(void *addr)这个函数可以睡眠因此不能从中断上下文调用。 三malloc(), vmalloc()和kmalloc()区别 [1]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 [2]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc和vmalloc一样也是虚连物理不一定连。 [3]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大 [4]内存只有在要被DMA访问的时候才需要物理上连续 [5]vmalloc比kmalloc要慢 四kzalloc kzalloc实现了kmalloc以及memset的功能一个函数起到了两个函数的作用 这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么做 , 先是用 kmalloc() 申请空间 , 然后用memset() 来初始化 , 而现在省事了 , 一步到位 , 直接调用kzalloc(), 效果等同于原来那两个函数 , 所有申请的元素都被初始化为 0. 其实对写驱动的来说 , 知道现在应该用 kzalloc() 代替原来的 kmalloc() 和 memset() 就可以了 , 这是内核中内存管理部分做出的改变 , 确切的说是改进 , 负责内存管理那部分的兄弟们的目标无非就是让内核跑起来更快一些 , 而从 kmalloc/memset 到kzalloc 的改变确实也是为了实现这方面的优化. 五目前kzalloc将取代kmalloc和memset功能。 以后在内核看到此函数的比率将会更高。 转载于:https://www.cnblogs.com/alan666/p/8312357.html