|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
新的Linux内核使用udev代替了hotplug作为热拔插管理,虽然有udevd管理热拔插,但有时候我们还是需要在应用程序中检测热拔插事件以便快速地处理,比如在读写SD卡的时候拔下SD卡,那么需要立即检测出该情况,然后结束读写线程,防止VFS崩溃。Netlink是面向数据包的服务,为内核与用户层搭建了一个高速通道,是udev实现的基础。该工作方式是异步的,用户空间程序不必使用轮询等技术来检测热拔插事件。 内核中使用uevent事件通知用户空间,uevent首先在内核中调用netlink_kernel_create()函数创建一个socket套接字,该函数原型在netlink.h有定义,其类型是表示往用户空间发送消息的NETLINK_KOBJECT_UEVENT,groups=1,由于uevent只往用户空间发送消息而不接受,因此其输入回调函数input和cb_mutex都设置为NULL。# D9 l3 ?/ t' Y9 D% |
$ D8 t+ J R( G
0 \/ C( \: J1 L; Z) P! _" r#include
3 j: |" x6 S$ A, M6 u5 vstruct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,
' I( T; S/ V7 @* r9 t* H2 S+ T, ^# a void (*input)(struct sk_buff *skb),
4 Z7 |7 F9 V) p; K6 c% U3 E struct mutex *cb_mutex,
' [% @. `( F3 Z7 N* E struct module *module); L+ _* ]1 H' b2 c6 j4 i7 ^' B
: E- F9 K& n4 M8 S6 [! d
7 K* P5 W+ l/ B0 V
ue_sk->sk = netlink_kernel_create(net, NETLINK_KOBJECT_UEVENT,( p( A, u) t3 N: F
1, NULL, NULL, THIS_MODULE);- p/ n& L7 H a8 x" W: C4 ~ H
( z* A( }3 T+ M
7 b. a" D# \5 v0 R- @4 N
5 g* s. V% s2 |- E当有事件发生的时候,调用 kobject_uevent()函数,实际上最终是调用4 L' J" r' p4 `) h' l1 X0 i
- n+ [; L% H* I# L8 r4 F7 v' S1 ~
: V f2 P4 y! w) J, K
netlink_broadcast_filtered(uevent_sock, skb , 0, 1, GFP_KERNEL , " Z6 k. A) W* S* E
kobj_bcast_filter, kobj);# e& \* |9 v0 q: g2 v
7 i" A0 [) K3 i) t( V0 V
# A8 s7 | c- T% ]& x) s* a7 Q- c5 n& t
完成广播任务。
& o" j/ f2 g- c) U& V
7 @- ?- Q/ S8 a( C/ k0 h# q9 ~4 N& N. c" t
# t1 Q3 B& G# ^/ `
$ S' D/ S; T: T8 |+ n
7 r) ?+ }& H Y7 ]' ?, u9 ~3 w" o5 x5 k' b0 {% x
9 u8 X0 K& m% l
- |9 l. i$ l; I* z
0 ?" j0 D( ?$ H8 p% y- J2 W* K4 U/ i$ h( P1 @( w6 |3 b
|
|