(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;
...
}
