首页 > 编程知识 正文

udec视频教程,udev满了

时间:2023-05-04 10:08:07 阅读:46426 作者:2212

本文参考以下两篇文章结合自己的理解进行总结。

3359 blog.csdn.net /黄mini long/article/details/83782142

3359 blog.csdn.net/chituhuan/article/details/52383610

一、udev概念:

1、udev是linux kernel的设备管理器,最新内核版本为kernel_3.10,udev替代了devfs、hotplug等功能。 根据系统中硬件设备的状态动态更新设备文件,如创建、删除设备文件。 设备文件通常位于/dev目录中。 使用udev时,/dev目录仅包含系统中实际存在的设备。

2、为什么udev会取代devfs?

udev是一个独立于硬件平台的用户空间进程,建立在操作系统之上,脱离了驱动程序层的关联。 它是基于此设计实现的,因此您可以随时更改和删除/dev下的设备文件名和指针,以根据需要放置和管理设备文件系统。 要实现这种灵活的功能,只需简单地更改udev配置文件,而不需要重新启动操作系统。

3、linux传统上使用的是静态设备创建方法,因此无论相应的硬件设备是否实际存在,都会在/dev下创建多个设备节点。 udev方法仅创建由kernel检测到的设备。

4、udev的配置文件在哪里?

udev是一个用户模式程序。 其配置文件为/etc/udev/udev.conf。 默认情况下,此文件包含以下内容:

udev_root='/dev '; 由udev生成的设备文件的根目录为/dev

udev_db='/dev/.udevdb '; 由udev生成的设备文件组成的数据库

udev_rules='/etc/udev/rules.d '; 包含指导udev工作的规则的目录。

udev_log='err '; 如果发生错误,请在syslog中记录错误消息。

二、udev机制:

1、udev如何获取内核的这些模块动态变化的信息

设备节点的创建通过在sysfs接口上分析dev文件来获取设备节点号。 那么,udevd通过什么机制知道内核中模块的变化情况,如何知道设备的插入和删除情况呢? 当然通过热插件机制,但是热插件是怎么实现的呢? 内核如何通知用户空间发生了事件?

答案是通过网络套接字通信在内核和用户空间之间传递信息。

内核调用Kobject_uevent函数将netlink消息发送到用户空间。 这部分工作通常不需要自己处理。 集成设备型号在子系统级别处理这部分代码。 这包括在创建和删除与设备相对应的特定kobject时发送相应的添加和移除消息。 当然前提是内核设置了Kobject

Netlink socket作为内核与用户空间的通信方式,不仅应用于热插拔机制,还应用于其他很多真正与网络相关的内核子系统。

udevd使用标准套接字机制创建套接字连接,以获取和解析内核广播的uevent事件。

2、Udevd如何监视规则文件的更改

如果内核版本足够新,则udev可以在规则文件发生更改时自动重新应用规则。 这要归功于内核的inotify机制。 inotify是一种文件系统更改通知机制,用户将立即收到添加、删除文件等事件。

在udevd上,对inotify和udev的netlink socket文件描述符都执行了选择等待操作。 有案后进一步处理。

3、Udevtrigger的工作原理?

运行udevd后,使用udevtrigger时,会创建内核中已存在的设备的节点,您是如何做到这一点的? 分析udevtrigger的代码,可以看到以下内容:

udevtrigger通过在/sysfs文件系统下的现有设备的事件节点中写入字符串“添加”来触发事件。 这样,udevd就可以接收这些事件,并为buildin的设备驱动程序创建设备节点和所有insmod的模块创建设备节点。

4、udev和mdev:udev和mdev是采用事件机制处理热插拔问题的两个用户空间程序,两者的实现机制不同。 udev基于netlink机制,在系统启动时运行deamon程序udevd,通过接收内核发送的uevent来创建/删除设备节点、加载/卸载驱动程序模块等mdev基于uevent_helper机制,在系统启动时将内核中的uevnet_helper变量更改为“/proc/sys/kernel/hotplug”,然后单击“/s无限发带这将在内核生成uevent时调用uevent_helper指向的用户级程序(即mdev ),并执行相应的热插拔行为。 udev使用的netlink机制在有大量事件的情况下高效,适合PC机; mdev使用的uevent_helper机制实现简单,适用于嵌入式系统。 此外,还说明uevent_helper的初始值

核编译时时可配置的,默认值为/s无限的发带/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了,例如:
echo “/s无限的发带/mdev” > /proc/sys/kernel/hotplug
原文链接:https://blog.csdn.net/chituhuan/article/details/52383610
原文链接:https://blog.csdn.net/huangminilong/article/details/83782142

三、如何得到udev ?
udev的主页在这里: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
我们按照下面的步骤来生成udev的工具程序,以arm-linux为例:
1、wget http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/udev-100.tar.bz2
2、tar xjf udev-100.tar.bz2
3、cd udev-100 编辑Makefile,查找CROSS_COMPILE,修改CROSS_COMPILE ?= arm-linux-
4、make

没有什么意外的话当前目录下生成udev,udevcontrol, udevd, udevinfo,udevmonitor,udevsettle,udevstart,
udevtest,udevtrigger九个工具程序,在嵌入式系统里,我们只需要 udevd和udevstart就能使udev工作得很好,
其他工具则帮助我们完成udev的信息察看、事件捕捉或者更高级的操作。

另外一个方法是直接使用debian提供的已编译好的二进制包,美中不足的是版本老了一些。
1、wget http://ftp.us.debian.org/debian/pool/main/u/udev/udev_0.056-3_arm.deb
2、ar -xf udev_0.056-3_arm.deb
3、tar xzf data.tar.gz

在s无限的发带目录里就有我们需要的 udevd和udevstart工具程序。
建议大家采用第一种方式生成的 udevd和udevstart。为什么要用最新udev呢?新的强,旧的弱,用强的不用弱的。

第四、如何配置udev?

1、首先,udev需要内核sysfs和tmpfs的支持(需要在udev进程启动前挂载sysfs和tmpfs文件系统),sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提
供存放空间,也就是说,在上电之前系统上是没有足够的设备文件可用的,我们需要一些技巧让kernel先引导起来。

由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock
是不存在的,我们无法让kernel找到rootfs,kernel只好停在那里panic。
这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号
从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel
的cmd line参数,使root=31:03,就可以让kernel在 udevd未起来之前成功的找到rootfs。

2、其次,需要做的工作就是重新生成rootfs,把 udevd和udevstart复制到/s无限的发带目录。然后我们需要在/etc/下为udev建立设备规则(/etc/udev/udev.conf和/etc/udev/rules.d/udev.rules),这可以说是udev最为复杂的一步。这篇文章提供了最完整的指导: Writing udev rules文中描述的复杂规则我们可以暂时不用去理会,上路指南将带领我们轻松穿过这片迷雾。这里提供一个由简入繁的方法,对于嵌入式系统,这样做可以一劳永逸。

1)在前面用到的udev-100目录里,有一个etc目录,里面放着的udev目录包含了udev设备规则的详细样例文
本。为了简单而又简洁,我们只需要用到etc/udev/udev.conf这个文件,在我们的rootfs/etc下建立一个udev目
录,把它复制过去,这个文件很简单,除了注释只有一行,是用来配置日志信息的,嵌入式系统也许用不上
日志,但是 udevd需要检查这个文件。

2)在rootfs/etc/udev下建立一个rules.d目录,生成一个空的配置文件touch etc/udev/rules.d/udev.conf。然后
我们来编辑这个文件并向它写入以下配置项:

###############################################
# vc devices
KERNEL=="tty[0-9]*", NAME="vc/%n"

# block devices
KERNEL=="loop[0-9]*", NAME="loop/%n"

# mtd devices
KERNEL=="mtd[0-9]*", NAME="mtd/%n"
KERNEL=="mtdblock*", NAME="mtdblock/%n"

# input devices
KERNEL=="mice" NAME="input/%k"
KERNEL=="mouse[0-9]*", NAME="input/%k"
KERNEL=="ts[0-9]*", NAME="input/%k"
KERNEL=="event[0-9]*", NAME="input/%k"

# misc devices
KERNEL=="apm_bios", NAME="misc/%k"
KERNEL=="rtc", NAME="misc/%k"
################################################

保存它,我们的设备文件系统基本上就可以了, udevd和udevstart会自动分析这个文件。

3、为了使 udevd在kernel起来后能够自动运行,我们在rootfs/etc/init.d/rcS中增加以下几行:

PATH=/无限的发带:/s无限的发带:/usr/无限的发带:/usr/s无限的发带export PATHudev_root=/dev#udevd是一个二进制文件UDEV_土豪的秋天=/s无限的发带/udevdtest -x $UDEV_土豪的秋天 || exit 1#udevstart是一个二进制文件UDEVSTART_土豪的秋天=/s无限的发带/udevstarttest -x $UDEVSTART_土豪的秋天 || exit 1#udev的配置文件UDEV_CONFIG=/etc/udev/udev.conftest -r $UDEV_CONFIG || exit 1. $UDEV_CONFIG#检查sysfs文件系统是否挂载SYSFS=/sysif [ ! -d $SYSFS ]; thenecho "${0}: SYSFS "$SYSFS" not found"figrep -q "^sysfs $SYSFS" /proc/mounts || mount -t sysfs sys /sys #将udev以ramfs文件系统的格式挂载到/etc目录if [ ! -d $udev_root ]; thenecho "${0}: udev_root "$udev_root" not found"figrep -q "^udev $udev_root" /proc/mounts || mount -t ramfs udev $udev_root || exit 1#创建虚拟终端ttyS0设备节点mknod /dev/ttyS0 c 4 64mkdir $udev_root/pts $udev_root/shm#为虚拟设备/dev/null、/dev/zero、/dev/console创建设备节点#/dev/null称为空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。mknod -m 0666 /dev/null c 1 3#/dev/zero“零”设备,可以无限的提供空字符(0x00,ASCII代码NUL)。常用来生成一个特定大小的文件。mknod -m 0666 /dev/zero c 1 5#/dev/console这个设备代表的是系统控制台。错误信息和诊断信息通常会被发送到这个设备。可用于printk信息输出。它是个虚拟设备, 他需要映射到真正的tty设备,比如2440,会映射到 ttySAC0mknod -m 0600 /dev/console c 5 1#启动udev文件系统的守护进程udevd$UDEV_土豪的秋天 -d#启动udevstart进程$UDEVSTART_土豪的秋天

4、重新生成rootfs,烧写到flash指定的rootfs part中。

5、如果需要动态改变设备规则,可以把etc/udev放到jffs或yaffs part,以备修改,根据需求而定,可以随时扩
充udev.conf中的配置项。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。