_linux中devm函数简介_ (linux中devm)

Linux中devm函数简介

随着嵌入式系统的广泛应用,嵌入式系统的需求不断增长。Linux作为一种广泛应用于嵌入式系统的操作系统,其在嵌入式系统中的应用也越来越广泛。在Linux中,devm函数被广泛应用于嵌入式系统中。本文将为大家介绍Linux中devm函数的概念和应用。

一、概述

在Linux驱动程序中,我们通常需要向内核申请一些设备资源,例如:申请内存、注册字符设备等等。然而,当我们不再使用这些设备资源时,我们需要撤销所使用的设备资源,以节省设备资源的使用。但是,当撤销不当时,可能会导致设备无法正常工作,极大地影响嵌入式系统的稳定性。在这种情况下,devm函数发挥了巨大的作用。

devm是Linux系统中的一个设备管理函数,全称为device managed(设备管理)。在Linux中,devm函数通常用来管理动态分配的资源,以便于设备的安全释放。设备可以被看作是一个有限的、值得保护的资源,所以使用devm函数可以让设备的管理和安全释放变得更为简单和安全。

二、devm函数的使用

1. devm函数的介绍

devm函数是一个宏定义函数,其定义如下:

#define devm_(p, f) \

({\

typeof(p) ___ptr = (p);\

___ptr ? (f) : NULL;\

})

其中,p为指向资源的指针,f是一种资源管理的函数。

2. devm函数的作用

devm函数是以“设备管理的方式”(device managed)为基础,在记忆资源分配时,将自动记录相应资源的释放操作。在驱动程序中,当设备不再使用某个资源(例如:内存或I/O端口)时,使用devm函数会自动调用相应资源的释放操作,从而防止资源泄露和内存泄露的问题。

3. devm函数的应用场景

在Linux设备驱动程序中,devm函数通常与i2c、spi、pinctrl等设备相关的API一起使用,以及和动态分配的内存相关API一起使用。在以下场景中,常常使用devm函数来管理内存和设备资源。

(1)pinctrl

pinctrl是Linux系统中一个非常重要的组件,在调度GPIO(General Purpose Input Output)接口时,pinctrl可以根据不同的设备类型进行有效的GPIO使用。这时就需要使用devm_pinctrl_get函数进行注册。

(2)i2c

i2c是一种通讯总线,它通常应用于系统中的各种外设。在Linux中,i2c设备的驱动通常使用devm_i2c_new_device函数进行注册。

(3)spi

spi是一种高速串行传输协议,用于在嵌入式系统中的各种嵌入式设备之间进行通信。在Linux中,可以使用devm_spi_register_device函数进行注册。

(4)网络设备

在Linux系统中,网络设备是一个非常重要的资源。在我们使用一个网络设备之前,必须要开启该设备,并管理该设备的各种资源。常常使用devm函数管理该设备的资源。

4. devm函数的示例

在开发时,经常会使用动态内存分配。在使用完之后,需要手动释放内存,否则可能存在内存泄漏的问题。下面是一个实现应用devm函数的数据结构的示例,以便于释放内存等资源。

1. 声明devm函数

static int my_new(struct platform_device *pdev)

{

struct my_platform_device *mydev;

devm_(pdev, mydev) = devm_kzalloc(&pdev->dev, sizeof(*mydev), GFP_KERNEL);

if (!mydev)

return -ENOMEM;

memset(mydev, 0, sizeof(*mydev));

return 0;

}

2. 使用devm函数

static int my_probe(struct platform_device *pdev)

{

struct my_platform_device *mydev = dev_get_drvdata(&pdev->dev);

int ret = -ENOMEM;

/* allocate memory for mydev */

mydev = devm_kzalloc(&pdev->dev, sizeof(*mydev), GFP_KERNEL);

if (!mydev)

return -ENOMEM;

/* allocate memory for data */

mydev->data = devm_kzalloc(&pdev->dev, MY_DATA_SIZE, GFP_KERNEL);

if (!mydev->data)

goto err;

/* allocate memory for regulator */

mydev->regulator = devm_regulator_get(&pdev->dev, “my_regulator”);

if (IS_ERR(mydev->regulator)) {

ret = PTR_ERR(mydev->regulator);

goto err;

}

/* allocate memory for clk */

mydev->clk = devm_clk_get(&pdev->dev, “my_clk”);

if (IS_ERR(mydev->clk)) {

ret = PTR_ERR(mydev->clk);

goto err;

}

/* allocate memory for dma */

mydev->dma = devm_kzalloc(&pdev->dev, sizeof(struct dma_struct), GFP_KERNEL);

if (!mydev->dma)

goto err;

/* allocate memory for timer */

mydev->timer = devm_timer_request(&pdev->dev, my_timer);

if (IS_ERR(mydev->timer)) {

ret = PTR_ERR(mydev->timer);

goto err;

}

return 0;

err:

/* release resources */

return ret;

}

在上面的示例中,使用了devm_kzalloc分配了内存空间,并且使用devm_regulator_get、devm_clk_get等函数分配了设备资源,当驱动需要撤销这些设备资源时,devm函数会自动调用相应的释放操作,从而保证设备的安全释放。

三、

了解了devm函数的概念和使用方法后,我们发现,在Linux设备驱动程序中,使用devm函数管理设备资源是一个十分方便和安全的方法。它不仅可以避免一些常见的驱动程序错误,还可以在释放内存时加强内存清理和释放的稳定性和可靠性。因此,在我们开发嵌入式系统时,建议使用devm函数来管理设备资源。

相关问题拓展阅读:

APF文件怎么打开啊?

把Adobe Reader下载后安装

APF: Advanced Policy Firewall,是 Rf-x Networks 出品的Linux环境下的软件防火墙。APF采用Linux系统默认的 iptables 规则。APF可以算是Linux中最出名的软件防火墙之一。

下载最新版的芹察空APF:

wget

解压:

tar -xzvf apf-current.tar.gz

进入APF目录:

cd apf-版本

安装!

./install.sh

安装完以后,开始配置APF:

nano /etc/apf/conf.apf

查找(ctrl + w) USE_DS=”0〃 ,将之更改为 USE_DS=”1〃 ;查找 USE_AD=”0〃 ,将之更改为 USE_AD=”1〃 。

然后开始配置最主要的部分:端口。

以下提供 cPanel, Ensim 和 Plesk 的推荐配置。

cPanel

IG_TCP_CPORTS=”20,21,22,25,26,53,80,110,143,443,465,993,995,2023,2023,2023,2023,2023,2023〃

IG_UDP_CPORTS=”21,53,873〃

EGF=”1〃

EG_TCP_CPORTS=”21,22,25,26,27,37,43,53,80,110,113,443,465,873,2023〃

EG_UDP_CPORTS=”20,21,37,53,873〃

Ensim

IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,19638〃

IG_UDP_CPORTS=”53〃

EGF=”1〃

EG_TCP_CPORTS=”21,22,25,53,80,110,443〃

EG_UDP_CPORTS=”20,21,53〃

Plesk

IG_TCP_CPORTS=”20,21,22,25,53,80,110,143,443,465,993,995,8443〃

IG_UDP_CPORTS=”37,53,873〃

EGF=”1〃

EG_TCP_CPORTS=”20,21,22,25,53,37,43,80,113,443,465,873〃

EG_UDP_CPORTS=”53,873〃

下面列出常规的端口,方便大家进行配置:

21/tcp ftp

22/tcp ssh

25/tcp tp

26/tcp 备用tp端口

80/tcp http

110/tcp pop3

143/tcp imap

443/tcp https

993/tcp imaps

995/tcp pop3s

3306/tcp mysql

5432/tcp postgres

53/udp dns

配置完成后保存退出,并启动APF防火墙:

/usr/local/in/apf -s

请注意,此时防火墙是运行在调试模式,每五分钟重洗配置。这样能避免因为错误的配置而使服务器瘫痪没州。

确保配置无误后,再次进入配置文件(nano /etc/apf/conf.apf),将 DEVM=”1〃 更改为 DEVM=”0〃 。这样APF就会运行在常规模式下。

重启APF(/usr/local/in/apf -s)。

注意事项:如果你的Linux内核将iptables直接编译而非模块模式的话,请将配置文件中的 MONOKERN=”0〃 更改为 MONOKERN=”1〃 。

可选配置:

APF有个新的功能便是防止DoS攻击(/etc/apf/ad)。其日志文件保存在/var/log/apfados_log。

下面我们将配置APF使其遇到DoS后发送电子邮件给管理员嫌瞎。

打开配置文件:

nano -w /etc/apf/ad/conf.antidos

查找 。

CONAME=”Your Company” 为你的网站或公司名称。

将 USR_ALERT=”0〃 更改为 USR_ALERT=”0〃 ,从而使系统发送电子邮件。

USR=”” 为你的电子邮件地址。

保存并退出,重启APF(/usr/local/in/apf -r)。

另外,如果需要让系统每次重新启动后自动运行APF,则执行以下命令:

chkconfig –level 2345 apf on

需要去除自动启动的话:

chkconfig –del apf

最后,希望大家都能顺利的为自己的Linux架设起一道有效的安全屏障。

用姿胡方正阅读器或者Adobereader这个软件,就可渣塌以打开。

  经常有人问什么什么如册圆扩展名的文件要用什么程序来打开,事实上,电脑上面真正能表示文件的类型并且得到一致承认的扩展名并不是很多,而大多数扩展名一般都是由使用该文件的软件的开发者定义的。

APF格式文件可以用Adobereader这个软件旁数

方正阅读运租首器也型辩可以用相同的方法打开

linux中devm的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux中devm,_linux中devm函数简介_,APF文件怎么打开啊?的信息别忘了在本站进行查找喔。


数据运维技术 » _linux中devm函数简介_ (linux中devm)