测试模板驱动程序
每当输入一个入口点例程时,该 dummy
驱动程序只向系统日志中写入一条消息。为了测试本驱动程序,需要留意这些消息,以确认成功地输入了所有入口点例程。
cmn_err(9F)
函数将低优先级的消息(如在该 dummy 驱动程序中定义的消息)写入 /dev/log。syslogd(1M)
守护进程从 /dev/log 读取消息并将低优先级的消息写入 /var/adm/messages。
在一个单独的窗口中输入下列命令,并在在执行测试(如本节内容所述)时监测输出:
% tail -f /var/adm/messages
|
加载驱动程序
加载驱动程序时要确保您是用户 root。使用
add_drv(1M)
命令来加载驱动程序:
在查看的 /var/adm/messages 的窗口中应该可以看到下列消息:
date time machine dummy:[ID 513080 kern.notice] NOTICE:Inside _info
date time machine dummy:[ID 874762 kern.notice] NOTICE:Inside _init
date time machine dummy:[ID 678704 kern.notice] NOTICE:Inside dummy_attach |
添加驱动程序时,_info(9E)、_init(9E) 和 attach(9E) 入口点按此顺序调用。
dummy 驱动程序已添加到 /devices 目录:
% ls -l /devices/pseudo | grep dummy
drwxr-xr-x 2 root sys 512 date time dummy@0
crw------- 1 root sys 92, 0 date time dummy@0:0 |
dummy
驱动程序还是 modinfo(1M)
列出的最新使用的模块:
% modinfo
Id Loadaddr Size Info Rev Module Name 180 ed192b70 544 92 1 dummy (dummy driver) |
模块名
dummy driver 是为 modldrv(9S) 结构第二个元素输入的值。值 92 是该模块的主设备号。
% grep dummy /etc/name_to_major
dummy 92 |
ed192b70 的 Loadaddr 地址是 dummy 驱动程序中第一条指令的地址。该地址可能会有用,如在调试中。
% mdb -k
> dummy`_init $m
BASE LIMIT SIZE NAME
ed192b70 ed192ff0 480 dummy
> $q
|
dummy
驱动程序还是伪设备部分中的 prtconf(1M)
列出的最新使用的模块:
% prtconf -P
pseudo, instance #0 dummy, instance #0 (driver not attached) |
未使用驱动程序时,它会被自动卸载。若驱动程序在 /devices 目录中但 modinfo(1M)
未列出,则可使用下列方法之一来加载驱动程序:
读写设备
在进行本节所述的测试时要确保您是用户 root。如果您不是用户
root,那么在访问 /devices /pseudo/dummy@0:0 专用文件时将收到
Permission denied 错误消息。请注意在加载驱动程序中为 /devices /pseudo/dummy@0:0
显示的权限。
对读取设备进行测试。dummy
设备可能被命名为 /devices /pseudo/dummy@0:0。下列命令可读取 dummy
设备,即使其名字略有不同:
# cat /devices/pseudo /dummy*
|
在查看 /var/adm/messages 的窗口中应该可以看到下列消息:
date time machine dummy:[ID 136952 kern.notice] NOTICE:Inside dummy_open
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 891851 kern.notice] NOTICE:Inside dummy_prop_op
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 891851 kern.notice] NOTICE:Inside dummy_prop_op
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 709590 kern.notice] NOTICE:Inside dummy_read
date time machine dummy:[ID 550206 kern.notice] NOTICE:Inside dummy_close |
对写入设备进行测试:
# echo hello > `ls /devices/pseudo /dummy*`
|
在查看 /var/adm/messages 的窗口中应该可以看到下列消息:
date time machine dummy:[ID 136952 kern.notice] NOTICE:Inside dummy_open
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 891851 kern.notice] NOTICE:Inside dummy_prop_op
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 891851 kern.notice] NOTICE:Inside dummy_prop_op
date time machine dummy:[ID 623947 kern.notice] NOTICE:Inside dummy_getinfo
date time machine dummy:[ID 672780 kern.notice] NOTICE:Inside dummy_write
date time machine dummy:[ID 550206 kern.notice] NOTICE:Inside dummy_close |
可以看到,写测试的输出与读测试的输出几乎是一样的。只有第七行输出不同。使用 cat(1) 命令将导致内核访问驱动程序的
read(9E)
入口点。使用 echo(1)
命令将导致内核访问驱动程序的 write(9E)
入口点。为 echo(1)
指定的文本参数被忽略了,因为本驱动程序与该数据没有任何关系。
卸载驱动程序
卸载驱动程序时要确保您是用户 root。使用
rem_drv(1M)
命令可以卸载驱动程序并从 /devices 目录删除该设备:
在查看 /var/adm/messages 的窗口中应该可以看到下列消息:
date time machine dummy:[ID 513080 kern.notice] NOTICE:Inside _info
date time machine dummy:[ID 617648 kern.notice] NOTICE:Inside dummy_detach
date time machine dummy:[ID 812373 kern.notice] NOTICE:Inside _fini |
dummy 设备不再位于 /devices 目录:
# ls /devices/pseudo /dummy*
/devices/pseudo/dummy*: No such file or directory |
下次读写该 dummy 设备时必须使用 add_drv(1M) 重新加载本驱动程序。
可以使用 modunload(1M)
命令来卸载驱动程序,但并不从 /devices 删除该设备。那么在下次读写该 dummy
设备时,驱动程序会自动加载。
按下 Control-C 可以停止对 /var/adm/messages 消息的跟踪。
|