linux内核函数 devm_kzalloc()和devm_kfree()

函数devm_kzalloc()和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(装置)有关的,当设备(装置)被拆卸或者驱动(驱动程序)卸载(空载)时,内存会被自动释放。另外,当内存不在使用时,可以使用函数devm_kfree()释放。
而kzalloc()则需要手动释放(使用kfree()),但如果工程师检查不仔细,则有可能造成内存泄漏。

注:也就是在驱动的探针函数中调用devm_kzalloc(),在除去函数中调用devm_kfree()函数


static inline void * devm_kzalloc(struct device * dev,size_t size,gfp_t gfp)
{
    return devm_kmalloc(dev,size,gfp | __GFP_ZERO);                                                                                                                                                         
}
                         
/**
 * devm_kmalloc - Resource-managed kmalloc   
 * @dev: Device to allocate memory for     //struct device
 * @size: Allocation size                  //memory size
 * @gfp: Allocation gfp flags              //gfp flag
 *
 * Managed kmalloc.  Memory allocated with this function is
 * automatically freed on driver detach.  Like all other devres 
 * resources, guaranteed alignment is unsigned long long.   //memory 对齐
 *
 * RETURNS:
 * Pointer to allocated memory on success, NULL on failure. //成功返回首地质,失败返回NULL
 */
void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)                                                                                                                                               
{
    struct devres *dr;
                       
    /* use raw alloc_dr for kmalloc caller tracing */
    dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
    if (unlikely(!dr))
        return NULL;


    /* 
     * This is named devm_kzalloc_release for historical reasons
     * The initial implementation did not support kmalloc, only kzalloc
     */
    set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
    devres_add(dev, dr->data);
    return dr->data;
}
EXPORT_SYMBOL_GPL(devm_kmalloc);
/**         
 * devm_kfree - Resource-managed kfree
 * @dev: Device this memory belongs to
 * @p: Memory to free
 *  
 * Free memory allocated with devm_kmalloc().
 */  
void devm_kfree(struct device * dev,void * p)                                                                                                                                                                  
{
    int rc;

    rc = devres_destroy(dev,devm_kmalloc_release,devm_kmalloc_match,p);
    WARN_ON(RC);
}
EXPORT_SYMBOL_GPL(devm_kfree);

详情参考:HTTPS://blog.csdn.net/jgw2008/article/details/52691568

注:内核版本:4.9

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值