|
@@ -0,0 +1,55 @@
|
|
|
+# 设备与驱动
|
|
|
+
|
|
|
+设备与驱动模块是 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 操作与设备支持输入输出操作,通过 `read` 和 `write` 方法完成数据的流式传输。字符设备也具有很好的扩展性,Eonix 提供了 `VirtualCharDevice` 接口,只需实现 `read` 和 `write` 这两个方法即可快速扩展字符设备支持。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 终端设备
|
|
|
+
|
|
|
+终端设备是字符设备的子集,专注于用户交互和作业控制,结合会话与进程组实现全面支持。
|
|
|
+
|
|
|
+### 终端功能
|
|
|
+1. 交互式控制:通过 `commit_char`、`show_char` 等方法支持根据当前终端的配置完成字符回显、信号响应和缓冲区管理。
|
|
|
+- 模式切换:支持 **canonical(cooked)** 模式和 **raw**模式,适应不同的交互需求。
|
|
|
+- 信号与回显:通过 `signal` 和 `echo_char` 方法,支持中断、退出和挂起等信号处理。
|
|
|
+- 作业控制:通过 `set_session` 和 `drop_session` 实现终端与会话的动态绑定。终端设备中保存的会话对象有前台进程组的属性,当接收到控制字符的时候可以产生对应的信号,并且发送给前台进程组。用户程序可以使用 `tcsetpgrp` 等设置当前的前台进程组,完成作业控制。
|
|
|
+- 终端配置:终端设备通过 `Termios` 结构实现配置管理,支持输入、输出、控制和本地模式等多种配置参数,并提供标准化方法(如 `new_standard`)快速初始化。
|
|
|
+
|
|
|
+其他的设备驱动想要实现一个终端也非常容易,只要实现 `TerminalDevice` 接口,就可以创建一个终端设备,也简化了设备驱动的开发。
|