(1条消息) linux内核的内存分配函数

作用

函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(device)有关的,

当设备(device)被detached或者驱动(driver)卸载(unloaded)时,内存会被自动释放。另外,也可以通过函数

devm_kfree()手动释放。

而kzalloc()则需要手动释放(使用kfree()),但如果工程师检查不仔细,则有可能造成内存泄漏。

格式

static inline void * devm_kzalloc(struct device * dev,size_t size,gfp_t gfp)

{

return devm_kmalloc(dev,size,gfp | __GFP_ZERO);

}

void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)

{

struct devres *dr;

dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));

if (unlikely(!dr))

return NULL;

set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);

devres_add(dev, dr->data);

return dr->data;

}

EXPORT_SYMBOL_GPL(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);

示例

struct s3c2440_i2c_dev {

struct device *dev;

void __iomem *base;

struct i2c_msg *msg;

u32  frequency;

int speed_mode;

int slave_addr;

struct i2c_adapter  adap;

};

static int s3c2440_i2c_probe(struct platform_device *pdev)

{

struct s3c2440_i2c_dev *i2c_dev;

struct i2c_adapter *adap;

struct device *dev = &pdev->dev;

struct resource *res;

i2c_dev = devm_kzalloc(&pdev->dev, sizeof(struct s3c2440_i2c_dev), GFP_KERNEL);

if(!i2c_dev)

return -ENOMEM;

...

}

(0)

相关推荐