编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

编译和链接驱动程序

您需要编译每个驱动程序源文件,并将生成的对象文件链接到驱动程序模块中。Oracle Solaris OS 既与 Oracle Solaris Studio C 编译器兼容,又与 Free Software Foundation, Inc. 提供的 GNU C 编译器兼容。除非另有说明,否则本节中的示例均使用 Oracle Solaris Studio C 编译器。有关 Oracle Solaris Studio C 编译器的信息,请参见《Oracle Solaris Studio 12.3:C 用户指南》Oracle Solaris Studio Documentation(Oracle Solaris Studio 文档)。有关编译和链接选项的更多信息,请参见 Oracle Solaris Studio 12.3 Command-Line Reference(Oracle Solaris Studio 12.3 命令行参考信息)文档。/usr/sfw 目录中提供了GNU C 编译器。有关 GNU C 编译器的信息,请参见 http://gcc.gnu.org/,或者查看 /usr/sfw/man 中的手册页。

以下示例显示一个名为 xx 的驱动程序,该驱动程序包含两个 C 源文件。生成的驱动程序模块名为 xx。本示例中创建的驱动程序适用于 32 位内核。您必须使用 ld –r,即使您的驱动程序只有一个对象模块也是如此。

% cc -D_KERNEL -c xx1.c
% cc -D_KERNEL -c xx2.c
% ld -r -o xx xx1.o xx2.o

必须定义 _KERNEL 符号以指示此代码定义了一个内核模块。除了驱动程序专用符号以外,不应定义任何其他符号。可以定义 DEBUG 符号,以启用任何对 ASSERT(9F) 的调用。

表 22-1  SPARC 和 x86 64 位体系结构的编译器选项
编译器
SPARC 64
x86 64
Studio 9
cc -D_KERNEL -xarch=v9 -c xx.c
不支持
Studio 10
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Studio 11
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Oracle Solaris Studio 12
cc -D_KERNEL -m64 -c xx.c
cc -D_KERNEL -m64 -xmodel=kernel -c xx.c

–xmodel 选项使编译器可以针对 Oracle Solaris x86 平台修改 64 位对象形式,只应在要编译此类对象时指定该选项。有关更多信息,请参见《Oracle Solaris Studio 12.3: C User's Guide》(《Oracle Solaris Studio 12.3:C 用户指南》)中的 –xmodel 选项描述。


Caution

注意  -  如果使用 Oracle Solaris Studio 编译器对 32 位或 64 位 x86 体系结构进行编译,则需要确保编译操作不会生成 MMX 或 SSE 指令。MMX 和 SSE 指令在 x86 内核中不受支持。使用 MMX 或 SSE 指令会引起内核紧急情况,因此不应使用。


下表列出了注意事项和用于生成代码而不会为 x86 体系结构生成 MMX 或 SSE 指令的编译器选项。

表 22-2  注意事项和用于生成代码而不会为 x86 体系结构生成 MMX 或 SSE 指令的编译器选项
Oracle Solaris Studio 编译器版本
针对 64 位进行编译
针对 32 位进行编译
12.3 或较旧版本
  • 不要在源代码中使用浮点类型。

  • 使用 -xvector=no 编译器选项关闭微向量化。

缺省情况下,编译器生成代码而不生成 MMX 或 SSE 指令。因此,不要为 MMX 和 SSE2 指令(例如 sse2sse2a 等)添加 –xarch 选项。有关所有 –xarch 值的列表,请参见《Oracle Solaris Studio 12.3: C User's Guide》(《Oracle Solaris Studio 12.3:C 用户指南》)。
12.4 或更新版本
要避免生成 SSE2 指令,请使用 -xregs=no%float 编译器选项。
缺省情况下,编译器使用 -xarch=sse2 选项并添加 SSE2 指令。因此,使用 -xregs=no%float 编译器选项。

驱动程序稳定后,您可能需要添加优化标志来生成符合生产质量要求的驱动程序。有关 Oracle Solaris Studio C 编译器中的优化的特定信息,请参见 Oracle Solaris Studio 12.3 Command-Line Reference(Oracle Solaris Studio 12.3 命令行参考信息)中的 cc(1) 手册页。

在设备驱动程序中,应该将全局变量视为 volatilevolatile 标记将在Declaring a Variable Volatile中详细介绍。标志的使用取决于平台。请参见手册页。