Jelajahi Sumber

doc: add device_driver.md

greatbridf 3 bulan lalu
induk
melakukan
f7441a1470
2 mengubah file dengan 59 tambahan dan 4 penghapusan
  1. 4 4
      README.md
  2. 55 0
      doc/device_driver.md

+ 4 - 4
README.md

@@ -27,11 +27,11 @@
 
 ## 初赛文档
 
-- [启动加载]()
+- [启动加载](https://gitlab.eduxiji.net/T202410247994622/project2608132-275906/-/blob/master/doc/boot.md)
 - [内存管理]()
-- [进程管理]()
-- [文件系统]()
-- [设备驱动]()
+- [进程管理](https://gitlab.eduxiji.net/T202410247994622/project2608132-275906/-/blob/master/doc/task.md)
+- [文件系统](https://gitlab.eduxiji.net/T202410247994622/project2608132-275906/-/blob/master/doc/filesystem.md)
+- [设备驱动](https://gitlab.eduxiji.net/T202410247994622/project2608132-275906/-/blob/master/doc/device_driver.md)
 - [多平台支持]()
 
 ## 代码树结构

+ 55 - 0
doc/device_driver.md

@@ -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` 接口,就可以创建一个终端设备,也简化了设备驱动的开发。