嵌入式linux 热插拔,嵌入式Linux下设备热插拔检测机制

udevmonitor 的原理也是捕捉 netlink 的 socket 消息,这个消息是内核发出的,打印出来的消息跟我上面的小程序一样,2.6内核支持udev,udev是在用户空间实现的程序,在终端输入 udevmonitor(有的版本或许是 udevadm -monitor) 然后插拔 USB 设备,可以看到提示信息。

转载至CSDN;erigido

无论如何都需要有一个线程来监控设备的状态。比如,插槽上或下位产生的中断,这个型号可以通过很多方式,如netlink、内存映射、软中断等等方式,让用户态线程能够感知是否有USB设备上线,如果有则调用mount函数,否则的话umonut。

arm linux下使用mdev vs udev

作者:songqqnew

3f288ee285423cc6e29fa526842ca321.png

udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent

时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作。udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时时可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了,例如:

echo “/sbin/mdev” > /proc/sys/kernel/hotplug

补充一点:如果使用的是udevd,那么uevent_helper变量应为空,即

echo “ ” > /proc/sys/kernel/hotplug

refer to

http://sxw0624.blog.163.com/blog/static/200168038201272451049893/

http://bbs.csdn.net/topics/300056887

http://blog.csdn.net/walkingman321/article/details/5917737

1.udev

1.启动方式

一般是在inittab的rcS的服务启动列表里面去启动

/etc/root@freescale /etc/rc.d$ cat rcS

#!/bin/sh

# minimal startup script, will work with msh (this is best available in

# MMUless format).

# load the configuration information

. /etc/rc.d/rc.conf //服务配置文件

mode=${1:-start}

if [ $mode = "start" ]

then

services=$cfg_services

else

services=$cfg_services_r

fi

cfg_services=${2:-$services}

echo "cfg:"

echo $cfg_services

# run the configured sequence

for i in $cfg_services

do

if [ -x /etc/rc.d/init.d/$i ]

then

/etc/rc.d/init.d/$i $mode //调用各个服务

fi

done

if [ $# -ge 2 ]

then

exit 0

fi

# show all kernel log messages

#echo 8 >  /proc/sys/kernel/printk

# run rc.local if present and executable

if [ -x /etc/rc.d/rc.local ]

then

/etc/rc.d/rc.local $mode

fi

root@freescale /etc/rc.d$ cat rc.conf

all_services="mount-proc-sys mdev udev hostname devfsd depmod modules filesystems syslog network inetd portmap dropbear sshd boa smb dhcpd settime fslgnome watchdog bluetooth gtk2 pango"

all_services_r="pango gtk2 bluetooth watchdog fslgnome settime dhcpd smb boa sshd dropbear portmap inetd network syslog filesystems modules depmod devfsd hostname udev mdev mount-proc-sys"

cfg_services="mount-proc-sys hostname depmod modules filesystems inetd "

cfg_services_r=" inetd filesystems modules depmod hostname mount-proc-sys"

export HOSTNAME="freescale"

export NTP_SERVER=""

export MODLIST=""

export RAMDIRS="/tmp /var"

export TMPFS="tmpfs"

export TMPFS_SIZE="512k"

export READONLY_FS=""

export INETD_ARGS=""

export BOA_ARGS=""

export SMBD_ARGS=""

export NMBD_ARGS=""

export DHCP_ARG=""

export DEPLOYMENT_STYLE="JFFS2"

export SYSCFG_DHCPC_CMD="udhcpc -b -i "

export DROPBEAR_ARGS=""

root@freescale /etc/rc.d/init.d$ cat udev

#!/bin/sh

PATH=$PATH:/sbin:/bin

if [ ! -x /sbin/udevd ]

then

exit 0

fi

case "$1" in

start)

echo "" > /proc/sys/kernel/hotplug

mount -n -o mode=0755 -t tmpfs tmpfs /dev

# Create static device nodes in /dev

mknod /dev/console c 5 1

mknod /dev/null c 1 3

echo "Starting the hotplug events dispatcher udevd"

udevd --daemon

echo "Synthesizing initial hotplug events"

udevtrigger

udevsettle --timeout=300

mkdir /dev/pts

mount -n -t devpts devpts /dev/pts

mkdir /dev/shm

;;

stop)

;;

reload)

udevcontrol --reload_rules

;;

*)

echo "Usage: /etc/rc.d/init.d/udev {start|stop|reload}"

echo

exit 1

;;

esac

exit 0

如果不需要启动时启动,需要在rc.conf中删除掉对应的服务项目

手动启动udev:

/etc/rc.d/init.d/udev start

启动时,主要启动了

udevd --daemon

udevtrigger

2.mdev

busybox带一个简化版,mdev ,通过mdev -s扫描设备文件,相当于sbin/udevstart;通过echo /sbin/mdev > /proc/sys/kernel/hotplug启用自动扫描,相当于/sbin/udevd --daemon

[root@hemei]# cat /etc/init.d/rcS

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

#

#       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.

#

trap ":" INT QUIT TSTP

/bin/hostname hemei

/bin/mount -n -t proc none /proc

/bin/mount -n -t sysfs none /sys

/bin/mount -n -t usbfs none /proc/bus/usb

/bin/mount -t ramfs none /dev

echo /sbin/mdev > /proc/sys/kernel/hotplug

/sbin/mdev -s

/bin/hotplug

# mounting file system specified in /etc/fstab

mkdir -p /dev/pts

mkdir -p /dev/shm

/bin/mount -n -t devpts none /dev/pts -o mode=0622

/bin/mount -n -t tmpfs tmpfs /dev/shm

/bin/mount -n -t ramfs none /tmp

#/bin/mount -n -t ramfs none /var

mkdir -p /var/empty

mkdir -p /var/log

mkdir -p /var/log/boa

mkdir -p /var/lock

mkdir -p /var/run

mkdir -p /var/tmp

/sbin/hwclock -s -f /dev/rtc

syslogd

/sbin/ifconfig lo 127.0.0.1

ifconfig eth0 hw ether 10:23:45:67:89:ab

/sbin/ifconfig eth0 192.168.1.168

/sbin/route add default gw 192.168.1.1

sbin/telnetd -l /bin/login

ip link set can0 up type can bitrate 125000

export PATH=$PATH:/usr/local/mysql/bin

export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql:$LD_LIBRARY_PATH

export LD_PRELOAD=/usr/lib/preloadable_libiconv.so

/usr/local/mysql/bin/mysqld_safe --user=root &

[root@hemei]# cat /etc/mdev.conf

# system all-writable devices

full            0:0     0666

null            0:0     0666

ptmx            0:0     0666

random          0:0     0666

tty             0:0     0666

zero            0:0     0666

# console devices

tty[0-9]*       0:5     0660

vc/[0-9]*       0:5     0660

# serial port devices

s3c2410_serial0 0:5     0666    =ttySAC0

s3c2410_serial1 0:5     0666    =ttySAC1

s3c2410_serial2 0:5     0666    =ttySAC2

s3c2410_serial3 0:5     0666    =ttySAC3

# loop devices

loop[0-9]*      0:0     0660    =loop/

# i2c devices

i2c-0           0:0     0666    =i2c/0

i2c-1           0:0     0666    =i2c/1

# frame buffer devices

fb[0-9]         0:0     0666

# input devices

mice            0:0     0660    =input/

mouse.*         0:0     0660    =input/

event.*         0:0     0660    =input/

ts.*            0:0     0660    =input/

# rtc devices

rtc0            0:0     0644    >rtc

rtc[1-9]        0:0     0644

# misc devices

mmcblk0p1       0:0     0600    =sdcard */bin/hotplug

sda1            0:0     0600    =udisk * /bin/hotplug

# sound card

controlC[0-9]   0:0     0664    =snd/

pcmC[0-9]D[0-9][cp]     0:0     0664    =snd/

timer           0:0     0664    =snd/

seq             0:0     0664    =snd/

[root@hemei]# cat /bin/hotplug

#!/bin/sh

case $MDEV in

sda1)

DEVNAME=udisk

MOUNTPOINT=/udisk

;;

mmcblk0p1)

DEVNAME=sdcard

MOUNTPOINT=/sdcard

;;

*)

exit 0

;;

esac

case $ACTION in

remove)

/bin/umount $MOUNTPOINT || true

rmdir $MOUNTPOINT >/dev/null 2>&1 || true

;;

*)

/bin/mkdir $MOUNTPOINT > /dev/null 2>&1 || true

/bin/mount -o sync -o noatime -o nodiratime -t vfat /dev/$DEVNAME $MOUNTPOINT > /dev/null 2>&1 || true

;;

esac

exit 0

http://blog.csdn.net/hugerat/article/details/3437099

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值