编写设备驱动程序

避免测试系统中发生数据丢失

驱动程序错误有时会导致系统无法引导。通过采取预防措施(如本节中所述),可以避免在此情况下重新安装系统。

备份关键系统文件

许多与驱动程序相关的系统文件都很难重新构造(如果可以重新构造)。如果安装期间驱动程序使系统崩溃,则诸如 /etc/name_to_major /etc/driver_aliases/etc/driver_classes/etc/minor_perm 之类的文件会损坏。请参见 add_drv(1M) 手册页。

为安全起见,请在正确配置测试计算机后生成根文件系统的副本。如果打算修改 /etc/system 文件,请在修改之前生成该文件的副本。

Procedure使用替代内核进行引导

为避免系统无法运行,应从内核副本和关联的二进制文件进行引导,而不是从缺省内核进行引导。

  1. /platform/* 中生成驱动程序的副本。


    # cp -r /platform/`uname -i`/kernel /platform/`uname -i`/kernel.test
    
  2. 将驱动程序模块放在 /platform/`uname -i`/kernel.test/drv 中。

  3. 引导替代内核,而非缺省内核。

    创建并存储替代内核后,可通过许多方法来引导此内核。

    • 可通过重新引导来引导替代内核:


      # reboot -- kernel.test/unix
      
    • 在基于 SPARC 的系统中,还可以从 PROM 进行引导:


      ok boot kernel.test/sparcv9/unix
      

      注 –

      要使用 kmdb 调试程序进行引导,请按模块调试程序入门中所述使用 -k 选项。


    • 在基于 x86 的系统中,当引导过程中显示 Select (b)oot or (i)nterpreter: 消息时,请键入以下命令:


      boot kernel.test/unix
      

示例 22–4 引导替代内核

以下示例说明如何使用替代内核进行引导。


ok boot kernel.test/sparcv9/unix
Rebooting with command: boot kernel.test/sparcv9/unix
Boot device: /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0:a File and \
    args:
kernel.test/sparcv9/unix


示例 22–5 使用 -a 选项引导替代内核

也可以使用询问功能 (-a) 选项进行引导来更改模块路径。使用此选项会生成用于配置引导方法的一系列提示。


ok boot -a
Rebooting with command: boot -a
Boot device: /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0:a File and \
args: -a
Enter filename [kernel/sparcv9/unix]: kernel.test/sparcv9/unix
Enter default directory for modules
[/platform/sun4u/kernel.test /kernel /usr/kernel]: <CR>
Name of system file [etc/system]: <CR>
SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2002 Sun Microsystems, Inc. All rights reserved.
root filesystem type [ufs]: <CR>
Enter physical name of root device
[/sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0:a]: <CR>

考虑替代备份计划

如果将系统连接到网络,则可将测试计算机添加为服务器的客户机。如果出现问题,可从网络引导系统。然后,便可挂载本地磁盘,并进行任何修复。也可以直接从 Solaris 系统 CD-ROM 引导系统。

另一种从灾难中恢复的方法是获取另一个可引导的根文件系统。使用 format(1M) 创建一个大小与原始分区完全相同的分区。然后,使用 dd(1M) 复制可引导的根文件系统。创建副本后,在新文件系统上运行 fsck(1M) 以确保其完整性。

以后,如果系统无法从原始根分区进行引导,可引导备份分区。可以使用 dd(1M) 将备份分区复制到原始分区。可能会遇到这样的情况,即使根文件系统未损坏,也无法引导系统。例如,只有引导块或引导程序损坏。在这种情况下,可使用询问功能 (-a) 选项从备份分区进行引导。然后,将原始文件系统指定为根文件系统。

捕获系统崩溃转储

当系统出现紧急情况时,系统会将内核内存的映像写入转储设备。缺省情况下,该转储设备是最合适的交换设备。该转储是系统崩溃转储,它与应用程序生成的核心转储类似。在系统出现紧急情况后进行重新引导时,savecore(1M) 会检查转储设备中是否存在崩溃转储。如果找到转储,savecore 将生成名为 unix.n 的内核符号表的副本。然后,savecore 实用程序将在核心映像目录中转储名为 vmcore.n 的核心转储文件。缺省情况下,核心映像目录为 /var/crash/machine_name。如果 /var/crash 没有足够的空间用于核心转储,系统将显示所需的空间,但不实际保存转储。然后,可针对核心转储和已保存的内核使用 mdb(1)

在 Solaris 操作系统中,缺省情况下会启用崩溃转储。dumpadm(1M) 命令用于配置系统崩溃转储。使用 dumpadm 命令可以验证崩溃转储是否已启用,并确定保存核心转储文件的位置。


注 –

可以阻止 savecore 实用程序填满文件系统,即在要保存转储的目录中添加一个名为 minfree 的文件。在此文件中,指定在 savecore 运行后保持可用的千字节数。如果没有足够的可用空间,则不保存核心转储文件。