设备与驱动模块是 Eonix 内核的核心功能之一,提供了对硬件资源的抽象与管理支持,涵盖了块设备、字符设备等多种类型,其中细分还有终端设备的支持。通过模块化与接口化的设计,Eonix 提供了灵活的扩展性和高效的硬件访问能力。
块设备主要用于存储设备的管理,以固定大小的块为单位进行数据传输。
块设备通过 BlockDevice
抽象,支持磁盘(Disk)和分区(Partition)两种类型。核心接口包括:
DevId
):唯一标识块设备。BlockRequestQueue
标准化数据请求的管理。BlockDevice
为设备实现请求队列以及块缓存(正在写)的功能,设备驱动只要实现其请求队列中处理请求的部分即可,这样大大方便了设备驱动的开发。read_raw
)和分段读取(read_some
),实现高效且灵活的数据访问。Eonix 内核通过 AHCI 驱动实现对 SATA 设备的支持。Eonix 内核的 AHCI 驱动设计模块化、结构清晰,包含命令接口、控制器和端口管理以及高效的中断处理机制。通过统一的接口设计和硬件加速机制,该驱动能够高效地完成设备初始化、数据传输和错误处理,为现代存储系统提供了可靠的支持。
AHCI 控制器通过 AdapterControl
结构进行管理。该结构映射了 HBA 的全局寄存器块(GHC),支持提供方法处理全局中断,通过读取 ports_implemented 寄存器获取已实现端口信息,为设备的多端口特性提供支持。AdapterControl
的方法通过读写寄存器实现对控制器状态的直接操作。每个 AHCI 端口通过 AdapterPort 表示,负责特定硬盘的命令管理和数据传输。AHCI 驱动通过统一的 Command
接口抽象了硬盘的各种操作命令。不同类型的命令如标识命令(IdentifyCommand
)和逻辑块读取命令(ReadLBACommand
)实现了该接口。其中使用 FreeList 结构维护空闲和工作中的命令槽,实现多命令并发处理。通过 send_command
方法发送命令,利用硬件加速的数据结构 PRDT 支持高效数据传输。在中断触发时,通过 handle_interrupt
方法检测并处理各个端口的中断请求,确保传输过程的完整性。
字符设备主要面向流式数据传输,适用于终端、虚拟设备等交互场景。
字符设备通过 CharDevice
抽象,包括两种类型:
/dev/null
和 /dev/zero
和控制台设备(console
)提供特殊功能,满足多样化需求。字符设备通过 register
方法完成注册,并维护全局字符设备表(CHAR_DEVICES
)以支持快速查找。I/O 操作与设备支持输入输出操作,通过 read
和 write
方法完成数据的流式传输。字符设备也具有很好的扩展性,Eonix 提供了 VirtualCharDevice
接口,只需实现 read
和 write
这两个方法即可快速扩展字符设备支持。
终端设备是字符设备的子集,专注于用户交互和作业控制,结合会话与进程组实现全面支持。
commit_char
、show_char
等方法支持根据当前终端的配置完成字符回显、信号响应和缓冲区管理。signal
和 echo_char
方法,支持中断、退出和挂起等信号处理。set_session
和 drop_session
实现终端与会话的动态绑定。终端设备中保存的会话对象有前台进程组的属性,当接收到控制字符的时候可以产生对应的信号,并且发送给前台进程组。用户程序可以使用 tcsetpgrp
等设置当前的前台进程组,完成作业控制。Termios
结构实现配置管理,支持输入、输出、控制和本地模式等多种配置参数,并提供标准化方法(如 new_standard
)快速初始化。其他的设备驱动想要实现一个终端也非常容易,只要实现 TerminalDevice
接口,就可以创建一个终端设备,也简化了设备驱动的开发。
由于项目之前的架构调整,块设备的请求队列的缓存被删掉了。正在将块缓存重新加回来。。。