编写配置方法

本文描述了 "配置设备" 方法的工作方式。 它还为程序员编写自己的配置设备配置方法提供了准则建议。

语法

配置开发 -我 姓名 [ -1 -2 ]

描述

"配置" 方法将设备从 "已定义" (在系统中不可用) 移动到 "可用" (在系统中可用)。 如果设备具有驱动程序,那么 "配置" 方法会将设备驱动程序装入到内核中,并向驱动程序描述设备特征。 对于中间设备 (例如 SCSI 总线适配器) ,此方法确定要配置哪些已连接的子设备,并将其逻辑名写入标准输出。

"配置" 方法由 姆杰夫 配置命令或由配置管理器调用。 由于配置管理器在第 2 阶段系统引导中第二次运行,并且也可以在运行时重复调用,因此可以调用设备的 "配置" 方法来配置 "可用" 设备。 这不是错误条件。 在中间设备的情况下, "配置" 方法会检查子设备是否存在。 如果该设备不是中间设备,那么该方法仅返回。

通常, "配置" 方法从 "配置" 数据库获取它需要的有关设备的所有信息。 用于指定系统引导的阶段的选项用于将某些功能限制为特定阶段。

如果该设备具有父设备,那么必须先配置父设备。 如果父代未处于 "可用" 状态,那么设备的 "配置" 方法将失败。

按照约定, "配置" 方法的名称的前三个字符是 配置。 名称的其余部分 (开发) 可以是任何标识使用该方法的设备或设备组的字符 (受操作系统文件名限制的限制)。

标志

描述
-l 名称 用于标识要配置的设备的逻辑名。
-1 指定正在系统引导处理的第 1 阶段配置该设备。 该选项不能与 -2 标记一起指定。 如果既未指定 -1 标记,也未指定 -2 标记,则会在运行时调用配置方法。
-2 指定正在系统引导的第 2 阶段配置该设备。 该选项不能与 -1 标记一起指定。 如果既未指定 -1 标记,也未指定 -2 标记,则会在运行时调用配置方法。

处理设备重要产品数据 (VPD)

通过在设备的每个 PdDv 对象中将 VPD 标志描述符设置为 TRUE ,在预定义的设备 (PdDv) 对象类中标识提供重要产品数据 (VPD) 的设备。 Configure 方法必须从设备获取 VPD ,并将其存储在定制 VPD (CuVPD) 对象类中。 请参阅相应的硬件文档以确定如何检索设备的 VPD。 在许多情况下, VPD 是使用 sysconfig 子例程从设备驱动程序获取的。

从设备获取 VPD 后, Configure 方法会查询 CuVPD 对象类以查看设备是否存储了硬件 VPD。 如果是这样,那么该方法会将从设备获取的 VPD 与从 CuVPD 对象类获取的 VPD 进行比较。 在这两种情况下,如果 VPD 相同,那么不需要进一步处理。 如果它们不同,请在设备的 CuVPD 对象类中更新 VPD。 如果设备的 CuVPD 对象类中没有 VPD ,请添加设备的 VPD。

通过首先将设备的 VPD 与 CuVPD 对象类中的 VPD 进行比较,可以减少对 CuVPD 对象类的修改。 这是因为来自设备的 VPD 通常不会发生更改。 减少数据库写入次数将提高性能并最大限度减少可能的数据丢失。

了解配置方法错误

对于检测到的许多错误, "配置" 方法将使用相应的退出代码退出。 在其他情况下, "配置" 方法可能需要撤销它已执行的某些操作。 例如,在装入设备驱动程序并将设备定义到驱动程序之后, "配置" 方法在下载微码时可能会迂到错误。 如果发生这种情况,那么该方法将使用 sysconfig 子例程从驱动程序终止设备,并使用 洛德克特 子例程卸载驱动程序。

如果成功分配了特殊文件,并且在迂到错误之前创建了特殊文件,那么 Configure 方法不会删除这些特殊文件,也不会取消分配主要和次要编号。 这是因为操作系统的配置方案允许为设备维护主号码和次号码以及特殊文件,即使该设备未配置也是如此。

如果再次配置设备,那么 "配置" 方法将识别是否分配了主号码和次号码以及是否存在特殊文件。

在 "配置" 方法检查子设备时,它已成功配置该设备。 检查子设备时发生的错误以 _FINDCHILD 退出码指示。 姆杰夫 命令检测 "配置" 方法是否已成功完成。 如果需要,它将显示一条消息,指示在查找子设备时发生错误。

编写配置方法的准则

以下任务是编写 "配置" 方法的准则。 针对特定设备进行写入时,可能会省略某些任务。 例如,如果该设备不是中间设备或没有驱动程序,那么将相应地编写该方法。 设备也可能具有这些任务中未列出的特殊需求。

Configure 方法必须:

  1. 验证输入参数。 必须提供 -我 逻辑名标志,以标识要配置的设备。 -1-2 标记不能同时提供。
  2. 初始化对象数据管理器 (ODM)。 使用 odm_initialize 子例程并使用 奥德莫洛克 子例程锁定配置数据库。 请参阅 "编写定义方法" 以获取示例。
  3. 检索要配置的设备的定制设备 (CuDv) 对象。 CuDv 对象的 "设备名" 描述符必须与 -l 逻辑名标志提供的名称匹配。 如果找不到具有指定名称的对象,那么该方法将退出并返回错误。
  4. 检索要配置的设备的预定义设备 (PdDv) 对象。 PdDv 对象的唯一类型描述符必须与设备的 CuDv 对象的 PdDv 对象类描述符的链接匹配。
  5. 获取设备的 PdDv 对象的 LED 值描述符。 检索设备的 PdDv 对象的 LED 值描述符,并使用 setleds 子例程在系统指示灯上显示此值 (如果指定了 -1-2 标志)。 这指定在引导时执行 Configure 方法的时间。 如果系统在引导时配置期间挂起,那么显示的指示灯值指示哪个配置方法创建了问题。

    如果已配置设备 (即,设备的 CuDv 对象的设备状态描述符指示 "可用" 状态) 并且是中间设备,请跳至检测子设备的任务。 如果设备已配置但不是中间设备,那么 "配置" 方法将在没有错误的情况下退出。

    如果设备处于 "已定义" 状态,那么 "配置方法" 必须检查父设备,检查设备是否存在,获取设备 VPD ,并更新设备的 CuDv 对象。

  6. 如果设备具有父代,那么 "配置" 方法会验证父代是否存在,并验证父代是否处于 "可用" 状态。 该方法查看设备的 CuDv 对象的 "父设备逻辑名" 描述符以获取父名称。 如果该设备没有父代,那么描述符将为空字符串。

    当设备具有父设备时, "配置" 方法将获取父设备的 CuDv 对象并检查 "设备状态" 描述符。 如果对象不存在或未处于 "可用" 状态,那么该方法将退出并返回错误。

    如果父设备存在,那么必须执行另一个检查。 "配置" 方法必须验证是否未配置任何其他连接到同一父设备 (位于同一连接位置) 的设备。 例如,可以使用交换机箱将两台打印机连接到同一个端口。 虽然每个打印机都具有相同的父代和连接,但一次只能配置一个打印机。

    Configure 方法通过查询 CuDv 对象类来执行此检查。 它查询其 "设备状态" 描述符设置为 "可用" 状态且其 "父设备逻辑名" 和 "已在父设备描述符上连接的位置" 与正在配置的设备的 "已连接" 匹配的对象。 如果找到匹配项,那么该方法将退出并返回错误。

  7. 请检查设备是否存在。 如果设备是适配卡,并且已在运行时调用 "配置" 方法 (通过同时缺少 -1-2 标志来指示) ,那么 "配置" 方法必须验证适配卡是否存在。 这是通过从卡中读取 POS 寄存器来完成的。 (POS 寄存器是通过打开和访问 /dev/bus0/dev/bus1 特殊文件获得的。) 这是必需的,因为如果卡存在,那么 Configure 方法必须调用 布萨里 库例程以分配总线资源,从而避免与系统中的其他适配卡发生冲突。 如果该卡不存在或者 布萨里 例程无法解析总线资源,那么该方法将退出并返回错误。
  8. 确定该设备是否具有设备驱动程序。 "配置" 方法从设备的 PdDv 对象的 "设备驱动程序名称" 描述符中获取设备驱动程序的名称。 如果此描述符为空字符串,那么表示设备没有设备驱动程序。

    如果设备具有设备驱动程序,那么 "配置" 方法必须:

    1. 使用 洛德克特 子例程装入设备驱动程序。
    2. 使用 根梅杰 子例程确定设备的主号。
    3. 使用 Getminor根未成年人 子例程或通过您自己的设备从属例程来确定设备的次编号。
    4. 如果特殊文件尚不存在,请在 /dev 目录中创建这些文件。 使用 姆克诺德 子例程创建特殊文件。
    5. 构建与设备相关的结构 (DDS)。 此结构包含描述设备到设备驱动程序的特征的信息。 这些信息通常 (但不一定) 从 "配置" 数据库中设备的属性中获取。 请参阅相应的设备驱动程序信息,以确定设备驱动程序期望 DDS 是什么样子。 "设备从属结构 (DDS) 概述" 主题描述了 DDS 结构。
    6. 使用 sysconfig 子例程来将 DDS 传递至设备驱动程序。
    7. 如果需要将代码下载到设备,请阅读所需的文件,并通过设备驱动程序提供的接口将代码传递给设备。 要下载的文件可能由预定义属性 (PdAt) 或定制属性 (CuAt) 对象标识。 按照约定,微码文件位于 /etc/microcode 目录中 (这是指向 /usr/lib/microcode 目录的符号链接)。 下载的适配器软件位于 /usr/lib/asw 目录中。
  9. 获取设备 VPD。 在与设备驱动程序相关的任务完成后,或者如果设备没有设备驱动程序,那么 "配置" 方法将确定它是否需要从设备获取重要产品数据 (VPD)。 设备的 PdDv 对象的 VPD 标志描述符指定它是否具有 VPD。
  10. 更新 CuDv 对象。 此时,如果未迂到任何错误,那么将配置该设备。 "配置" 方法将更新设备的 CuDv 对象的 "设备状态" 描述符,以指示它处于 "可用" 状态。 此外,如果当前设置为 MISSING ,请将 "变更状态" 描述符设置为 SAME。 如果在系统引导时未检测到该设备,并且正在运行时配置该设备,那么可能会发生此情况。
  11. 定义当前未在 CuDv 对象类中表示的检测到的子设备。 要完成此操作,请对每个新的子设备调用 "定义" 方法。 对于已在 CuDv 对象类中定义的每个检测到的子设备, Configure 方法会查看子设备的 CuDv "更改状态标志" 描述符,以了解是否需要更新该子设备。 如果描述符的值为 DONT_CARE,那么不需要执行任何操作。 如果它具有任何其他值,那么必须将其设置为 SAME ,并且必须更新子设备的 CuDv 对象。 系统将使用 "更改状态标志" 描述符来指示配置更改。

    如果该设备是中间设备,但无法检测连接的子设备,请查询有关此信息的 CuDv 对象类。 这些子设备的 "更改状态标志" 描述符的值应该为 DONT_CARE ,因为父设备无法检测到这些子设备。 有时,子设备具有一个属性,用于指定 "配置" 方法是否要配置子设备。 TTY 设备的 自动配置 属性是此类型属性的一个示例。

    无论子设备是否可检测, "配置" 方法都会将要配置的子设备的设备逻辑名写入到标准输出中,以空格字符分隔。 如果配置管理器调用了该方法,那么管理器将针对写入标准输出的每个子设备名称调用 "配置" 方法。

  12. 关闭所有对象类并终止 ODM。 关闭所有对象类并终止 ODM。 如果不存在任何错误, 0 使用 0 (零) 代码退出。

文件

描述
/dev/bus0 包含 POS 寄存器。
/dev/bus1 包含 POS 寄存器。
/etc/microcode 目录 包含微码文件。 /usr/lib/microcode 目录的符号链接。
/usr/lib/asw 目录 包含已下载的适配器软件。