vmalloc 函数常常和kmalloc作为内核申请内存的主要函数,vmalloc申请的内存是内存的虚拟地址是连续的,而kmalloc申请的内存的物理地址是连续的。而内核大多采用kmalloc,主要的原因是由于kmalloc申请的内存是物理上连续的,效率高,而vmalloc申请的内存虚拟地址连续,但是使用的时候需要经过一个页表转换,有开销,效率低。而且某些硬件设备是不经过内存管理单元的。
vmalloc的使用场合是内核模块动态的加载进内核的时候,使用vmalloc,而不是使用kmalloc,或者是需要申请大量的内存区域的时候,使用vmalloc更加合适。
而在内核中使用malloc函数更合适。
vmalloc申请的内存需要使用vfree释放才可以。
- if (kmem_virt(bio_ptr))
- page = vmalloc_to_page(bio_ptr);
- else
- page = virt_to_page(bio_ptr);
这个page是一个内存页面的数据结构,bio_ptr指向的是给定数据(比如dbuf中的数据)。这样通过virt_to_page将这个内核内存虚地址转换到一个页面当中去,然后加入到bio的bio_vec当中,然后通过submit_bio就可以将请求往下送了。
其中bio当中已经包含了block device。所以会自动的进入到该block device的队列当中。
阅读(2683) | 评论(0) | 转发(0) |