device_driver.md 4.9 KB

设备与驱动

设备与驱动模块是 Eonix 内核的核心功能之一,提供了对硬件资源的抽象与管理支持,涵盖了块设备、字符设备等多种类型,其中细分还有终端设备的支持。通过模块化与接口化的设计,Eonix 提供了灵活的扩展性和高效的硬件访问能力。


1. 块设备

块设备主要用于存储设备的管理,以固定大小的块为单位进行数据传输。

块设备抽象与接口

块设备通过 BlockDevice 抽象,支持磁盘(Disk)和分区(Partition)两种类型。核心接口包括:

  • 设备 ID(DevId):唯一标识块设备。
  • 容量与请求大小:支持定义设备容量和最大传输页数。
  • 块设备队列接口:通过 BlockRequestQueue 标准化数据请求的管理。BlockDevice为设备实现请求队列以及块缓存(正在写)的功能,设备驱动只要实现其请求队列中处理请求的部分即可,这样大大方便了设备驱动的开发。

块设备功能

  • 注册与分区管理
    驱动中将块设备通过注册后,可通过读取 MBR 实现自动分区探测,并支持动态添加分区等。
  • I/O 操作
    块设备支持直接数据传输(read_raw)和分段读取(read_some),实现高效且灵活的数据访问。

AHCI 驱动的集成

Eonix 内核通过 AHCI 驱动实现对 SATA 设备的支持。Eonix 内核的 AHCI 驱动设计模块化、结构清晰,包含命令接口、控制器和端口管理以及高效的中断处理机制。通过统一的接口设计和硬件加速机制,该驱动能够高效地完成设备初始化、数据传输和错误处理,为现代存储系统提供了可靠的支持。

AHCI 控制器通过 AdapterControl 结构进行管理。该结构映射了 HBA 的全局寄存器块(GHC),支持提供方法处理全局中断,通过读取 ports_implemented 寄存器获取已实现端口信息,为设备的多端口特性提供支持。AdapterControl 的方法通过读写寄存器实现对控制器状态的直接操作。每个 AHCI 端口通过 AdapterPort 表示,负责特定硬盘的命令管理和数据传输。AHCI 驱动通过统一的 Command 接口抽象了硬盘的各种操作命令。不同类型的命令如标识命令(IdentifyCommand)和逻辑块读取命令(ReadLBACommand)实现了该接口。其中使用 FreeList 结构维护空闲和工作中的命令槽,实现多命令并发处理。通过 send_command 方法发送命令,利用硬件加速的数据结构 PRDT 支持高效数据传输。在中断触发时,通过 handle_interrupt 方法检测并处理各个端口的中断请求,确保传输过程的完整性。


2. 字符设备

字符设备主要面向流式数据传输,适用于终端、虚拟设备等交互场景。

字符设备抽象与管理

字符设备通过 CharDevice 抽象,包括两种类型:

  • 终端(TTY)设备:支持用户交互和作业控制。
  • 其他虚拟设备:如 /dev/null/dev/zero 和控制台设备(console)提供特殊功能,满足多样化需求。

字符设备通过 register 方法完成注册,并维护全局字符设备表(CHAR_DEVICES)以支持快速查找。I/O 操作与设备支持输入输出操作,通过 readwrite 方法完成数据的流式传输。字符设备也具有很好的扩展性,Eonix 提供了 VirtualCharDevice 接口,只需实现 readwrite 这两个方法即可快速扩展字符设备支持。


3. 终端设备

终端设备是字符设备的子集,专注于用户交互和作业控制,结合会话与进程组实现全面支持。

终端功能

  1. 交互式控制:通过 commit_charshow_char 等方法支持根据当前终端的配置完成字符回显、信号响应和缓冲区管理。
  2. 模式切换:支持 canonical(cooked) 模式和 raw模式,适应不同的交互需求。
  3. 信号与回显:通过 signalecho_char 方法,支持中断、退出和挂起等信号处理。
  4. 作业控制:通过 set_sessiondrop_session 实现终端与会话的动态绑定。终端设备中保存的会话对象有前台进程组的属性,当接收到控制字符的时候可以产生对应的信号,并且发送给前台进程组。用户程序可以使用 tcsetpgrp 等设置当前的前台进程组,完成作业控制。
  5. 终端配置:终端设备通过 Termios 结构实现配置管理,支持输入、输出、控制和本地模式等多种配置参数,并提供标准化方法(如 new_standard)快速初始化。

其他的设备驱动想要实现一个终端也非常容易,只要实现 TerminalDevice 接口,就可以创建一个终端设备,也简化了设备驱动的开发。

4. 可以改进的点

由于项目之前的架构调整,块设备的请求队列的缓存被删掉了。正在将块缓存重新加回来。。。