字符列表结构
通过使用一组公共服务和数据缓冲区来处理格式为 字符列表的字符,可以实现字符设备驱动程序以及其他可执行字符时 I/O 的面向字符的支持。 字符列表 是一个由字符组成的列表或队列。 某些例程会将字符放入列表中,而其他例程会将这些字符从列表中除去。
称为 Cliss的字符列表包含一个 克列克 头和一个或多个称为字符块的数据缓冲区的链. 将字符放入队列会从公共池分配空间 (字符块) ,并将字符块链接到定义字符队列的数据结构中。 从队列获取字符会将相应的空间返回到池。
字符列表可用于字符设备驱动程序上半部分和下半部分之间的通信。 必须将这些例程所使用的 克列克 头和字符块固定在内存中,因为它们在 中断环境中进行访问。
字符列表服务的用户必须在任何时刻注册 (通常在设备驱动程序 德开放 例程中) 要使用的字符块的数量。 这允许内核管理字符块池中的置顶字符块数。 同样,当使用终止时 (例如,当设备驱动程序关闭时) ,使用例程应除去其字符块的注册。 平普夫 内核服务提供使用字符块的注册。
内核提供了四个用于从字符列表中获取字符或字符块的服务: 盖茨, 盖茨布, getcbp和 Getcx 内核服务。 另外,还有四个将字符或字符块添加到字符列表的服务: 普特克, 普特茨布, 普特克普和 普特克斯 内核服务。 Getcf 内核服务分配一个空闲字符块,而 普特比照 内核服务将一个字符块返回到空闲列表。 此外, 普特克尔 内核服务会将字符缓冲区的列表返回到空闲列表。 怀茨自由 内核服务确定是否有任何字符块在空闲列表中,如果没有任何字符块可用,那么等待一个字符块。
使用字符列表
对于您使用的每个字符列表,必须分配 克列克 头结构。 此 clist 结构在 /usr/include/sys/cblock.h 文件中定义。
您不需要关心如何维护 克列克 头中的字段,因为字符列表服务会为您执行此操作。 但是,您应该初始化c_cc计数字段为 0 ,并且两个字符块指针 (c_cf和c_cl) 在第一次使用 克列克 头之前为空。 克列克 结构定义这些字段。
字符列表中的每个缓冲区都是 cblock 结构,此结构也在 /usr/include/sys/cblock.h 文件中定义。
一个字符块数据区不需要完全用字符填充。 第一次 和 最后一个 字段是 数据 数组中基于零的偏移量,它实际包含数据。
对于字符缓冲区,只有有限的内存量可用。 所有字符驱动程序都共享此缓冲区池。 因此,您必须将字符列表中的字符数限制为数百个。 关闭设备时,设备驱动程序应确保其所有字符列表都已清空,以便将缓冲区返回到可用缓冲区列表。