Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1899100
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: LINUX

2013-01-11 14:12:28


vmalloc 函数常常和kmalloc作为内核申请内存的主要函数,vmalloc申请的内存是内存的虚拟地址是连续的,而kmalloc申请的内存的物理地址是连续的。而内核大多采用kmalloc,主要的原因是由于kmalloc申请的内存是物理上连续的,效率高,而vmalloc申请的内存虚拟地址连续,但是使用的时候需要经过一个页表转换,有开销,效率低。而且某些硬件设备是不经过内存管理单元的。

vmalloc的使用场合是内核模块动态的加载进内核的时候,使用vmalloc,而不是使用kmalloc,或者是需要申请大量的内存区域的时候,使用vmalloc更加合适。
而在内核中使用malloc函数更合适。

vmalloc申请的内存需要使用vfree释放才可以。

点击(此处)折叠或打开

  1. if (kmem_virt(bio_ptr))
  2.             page = vmalloc_to_page(bio_ptr);
  3.         else
  4.             page = virt_to_page(bio_ptr);
这个page是一个内存页面的数据结构,bio_ptr指向的是给定数据(比如dbuf中的数据)。这样通过virt_to_page将这个内核内存虚地址转换到一个页面当中去,然后加入到bio的bio_vec当中,然后通过submit_bio就可以将请求往下送了。
其中bio当中已经包含了block device。所以会自动的进入到该block device的队列当中。

阅读(2650) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~