}! u" A7 t5 e& L! @. R! @8 ^
8 U; i, K0 P* m s
static void __exit hello_exit (void) E' q/ p' L5 x: Y9 g2 ^: r, O- `4 G
& k- f( A( u/ i/ r {
& Q: ?6 m( P ^2 ~4 r& k
# l' e4 t7 N1 W. f$ V8 t8 G! V+ A cdev_del (&cdev);( ^) X: n5 p( j% X$ v: f3 U0 `
% I+ J3 @% m: v* i, \* J v- ~* B device_destroy(my_class, devno); //delete device node under /dev//必须先删除设备,再删除class类9 V" V4 {' u8 y) t+ f
y6 ^& m0 S6 H0 ?6 ^+ i7 d class_destroy(my_class); //delete class created by us
H; D+ M; z3 e. N5 H
+ i+ z3 l1 Z1 T unregister_chrdev_region (devno,NUMBER_OF_DEVICES);4 p! T5 J8 J# J$ F1 a+ C
# H& x" ]1 r* b3 H6 E( J/ [% P printk (KERN_INFO "char driver cleaned up\n");
$ H- t, `9 E0 d$ q9 x# t
$ x# O' t- }4 \ }
. C" @! i* g/ I8 g4 C6 W- T6 P
( ^) |* o8 u5 W( u! s& { module_init (hello_init);) b4 A( ~; Z$ T( t ?6 c* Y
5 J" W; X6 @7 m- G" K. ^- P3 z module_exit (hello_exit);
# o9 M6 p, W5 G/ M/ I% h 9 y+ P. [' E) e
MODULE_LICENSE ("GPL");' i3 m3 J% _9 k! P- z
' \ d2 k7 m O( v 这样,模块加载后,就能在/dev目录下找到memdev这个设备节点了。6 a% B- F8 k+ T, |; u9 {0 t+ T+ t
* }: ?3 R+ |7 l! \$ w7 v 例2:内核中的drivers/i2c/i2c-dev.c
6 R" B5 ] U( q
: ]$ Y4 Y; j% p% _5 u/ j5 Y 在i2cdev_attach_adapter中调用device_create(i2c_dev_class, &adap->dev,% z8 W! y& @6 H
: A* I5 {1 R( Q x/ U MKDEV(I2C_MAJOR, adap->nr), NULL,/ v8 Y% A* k% L3 ]
' S9 A* k J7 T0 d1 O; \* E "i2c-%d", adap->nr);8 n# p' T' L% Y0 A
2 v6 }" U/ {( X, }! U9 c( b$ d; q3 K
这样在dev目录就产生i2c-0 或i2c-1节点; F0 ?( m) S/ g7 F7 |- I
" c- q4 j& Q. R O$ z
接下来就是udev应用,udev是应用层的东西,udev需要内核sysfs和tmpfa的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间
$ E- t( ^5 A& a, e, ^- _6 a) u
( a! X$ E5 |8 ]2 C- r* W udev的源码可以在去相关网站下载,然后就是对其在运行环境下的移植,指定交叉编译环境,修改Makefile下的CROSS_COMPILE,如为 mipsel-linux-,DESTDIR=xxx,或直接make CROSS_COMPILE=mipsel-linux-,DESTDIR=xxx 并install把主要生成的udevd、udevstart拷贝rootfs下的/sbin/目录内,udev的配置文件udev.conf和 rules.d下的rules文件拷贝到rootfs下的/etc/目录内,并在rootfs/etc/init.d/rcS中添加以下几行:+ N8 O7 U$ j5 Y, m8 o8 g* r
- v3 R* j" C: l4 A7 } echo "Starting udevd…") A. @, a( v5 B% ?6 h3 g& B2 _1 q& M
+ B0 L3 e) f* u) ]: r2 b2 { /sbin/udevd --daemon* Y% {1 C6 y8 e
" J4 G7 R/ M( e( Y% x+ z /sbin/udevstart' ^ ~4 ] X* Z/ \+ f2 _4 W7 Y
! x9 X: o( b7 L' {
(原rcS内容如下:$ g2 h7 M6 [* [! P: o! }! @' p: F
& _. W3 l, H8 S2 M7 v2 |7 w8 g
# mount filesystems4 w! J0 O; w0 j
# g0 ~2 @. I1 E2 E: x
/bin/mount -t proc /proc /proc, c3 ~% @( H; R0 `) }& N
( S% X& j0 j1 z' w. ^' Y% }3 Q
/bin/mount -t sysfs sysfs /sys
; h2 t6 y5 L U* p( B7 g 4 O$ s$ E& u$ w5 y d8 a
/bin/mount -t tmpfs tmpfs /dev
' |- y/ ~0 C7 Z2 M: { + P. y, K8 a0 m
# create necessary devices
8 D; x* V$ w4 q- x0 J D. v# J 6 f. a% n' N% B5 G- x- A
/bin/mknod /dev/null c 1 3
! b6 E2 [8 d! u' r- n2 }: T
4 u! G, @6 D8 {5 U" m /bin/mkdir /dev/pts
0 [+ U3 ]) R0 p7 d6 Q7 t, c
+ z3 s3 \1 q/ j6 J /bin/mount -t devpts devpts /dev/pts1 v( X7 y: h+ d
7 c0 {# [4 }4 J$ g5 r /bin/mknod /dev/audio c 14 4
~3 n; m& ~5 Y, X6 @
! @) Q9 p' G* |, R3 e- s; B8 B /bin/mknod /dev/ts c 10 163 o3 T- k! y( p+ H! P
" u: L' g; Z+ Q3 y )- _+ D* u6 r; U" L
' `, K- x; }. Y% ]+ V& O3 x 这样当系统启动后,udevd和udevstart就会解析配置文件,并自动在/dev下创建设备节点文件 |