物理内存分配与回收(4)kmalloc 和 vmalloc

1.通用缓冲区

      在内核中初始化开销不大的数据结构可以合用一个通用的缓冲区。通用缓冲区最小为32B,然后依次为64B,128B,。。。直至128KB(即32个页面),但是,对通用缓冲区的管理采用的是Slab方式。从通用缓冲区中分配和释放缓冲区的函数:

     void *kmalloc (size_t  size, int flags);

     void kfree(const void *ptr);

     因此,当一个数据结构的使用不频繁,或其大小不足一个页面时,就没有必要为其分配专用缓冲区,而应该调用kmalloc()进行分配。如果数据结构的大小接近一个页面,则通过__get_free_pages()为它分配一个空间。

    事实上,在内核中,尤其是驱动程序中,有大量的数据结构仅仅是一次性使用,而且只有几十个字节。所以用kmalloc给他们分配内存就足够了。Linux2.0以前的版本中一般都调用kamlloc给内核数据结构分配内存,所以,调用该函数的一个优点是让用户开发的驱动能保持向后兼容(在新版本中同样可以用以前的方法编译)。

     kfree()释放由kmalloc()分配出来的内存块。如果释放的内存不是kmalloc()分配的,或者之前就被释放过的,再调用kfree()就会出现严重的后果。kfree和kmalloc要配对使用,以避免内存泄露和其他bug。但kfree(NULL)是安全的。


2.内核空间非连续内存的分配

    我们说,任何时候,CPU访问的都是虚拟内存,那么,我们在编写驱动程序,或者编写模块时,Linux给我们分

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值