编写设备驱动程序

在控制台帧缓存器驱动程序中实现轮询式 I/O

轮询式 I/O 接口在驱动程序中作为函数实现,并由内核终端仿真器直接调用。在执行 VIS_DEVINIT ioctl 命令期间,驱动程序会将其轮询式 I/O 入口点的地址传递给终端仿真器。VIS_DEVINIT 命令由终端仿真器启动。

以下代码中显示了 vis_polledio 结构。

typedef void * vis_opaque_arg_t;

struct vis_polledio {
      struct vis_polledio_arg *arg;
      void    (*display)(vis_opaque_arg_t, struct vis_consdisplay *);
      void    (*copy)(vis_opaque_arg_t, struct vis_conscopy *);
      void    (*cursor)(vis_opaque_arg_t, struct vis_conscursor *);
};

轮询式 I/O 接口提供的功能与 VIS_CONSDISPLAYVIS_CONSCOPY VIS_CONSCURSOR ioctl 接口的功能相同。要实现轮询式 I/O 接口,应该按照上面针对相应 ioctl 命令所述的相同步骤操作。轮询式 I/O 接口必须严格遵循本节其余部分所述的其他限制。

仅当操作系统处于静止状态并处于独立模式时,才调用轮询式 I/O 接口。每当用户进入 OpenBoot PROM 或 kmdb 调试器时,或者系统出现紧急情况时,系统就会进入独立模式。此时,只有一个 CPU 和一个线程处于活动状态。其他所有 CPU 和线程均会停止。分时、DDI 中断和系统服务都将关闭。

独立模式会严重限制驱动程序的功能,但会简化驱动程序同步要求。例如,用户应用程序无法通过在轮询式 I/O 例程中对控制台帧缓存器驱动程序进行内存映射这样的方式来访问该驱动程序。

在独立模式下,控制台帧缓存器驱动程序不得执行下列任一操作:

遵守这些限制并不困难,因为操作轮询式 I/O 函数相对较为简单。例如,在使用呈现引擎时,控制台帧缓存器驱动程序可以轮询设备中的某个位,而不是等待中断。驱动程序可以使用预先分配的内存来呈现位块传输 (blit) 数据。DDI 或 LDI 接口应该是不需要的。