·I/O 体系结构(这里,除了CPU和RAM之外的设备都称为I/O)
# CPU、RAM、I/O 之间的数据流通
# PCI、ISA、EISA、SCSI、USB
# 不同总线之间用“bridge”连接
·I/O设备与总线的硬件组织层次
# I/O端口(CPU寻址与数据通路,映射I/O)
# 接口(连接电路,定义电平等)
# 专用接口(图形接口、键鼠接口、磁盘接口等)
# 通用接口(GPIO)
# 设备控制器(设备本身的控制硬件)
·设备驱动程序模型
(linux2.6提供了一些数据结构和辅助函数,它们为系统中所有的“总线”、“设备”以及“设备驱动程序”提供了一个统一的视图;——这个框架被称为设备驱动程序模型)
·sysfs文件系统
(虚拟文件系统,/sys目录,与/proc文件系统本质上目的相同。其目标是——展现设备驱动程序模型组件间的层次关系。)
============================================
/sys 顶层目录
/block 块设备
/devices 所有被内核识别的硬件设备,按连接的总线对其进行组织
/bus 总线
/drivers 在内核中注册的设备驱动程序
/class 系统中设备的类型(各个集合)
/power 设备电源状态
/firmwara 固件相关
===========================================
/dev 文件系统中的设备(block char),是对devices目录下设备的symbolic链接
/fs 文件系统的注册信息
/module 在内核中注册的模块信息(大多也是一些向devices、bus中的symbolic链接),把它们单独组织出来,便于观察使用
/kernel ...
===========================================
·设备驱动程序模型核心
(如果要让kobject、kset、subsystem出现在sysfs的目录树中,就要先在内核中注册它们。充分理解linux驱动程序模型架构,就是要充分理解该核心的意义与实践)
# 数据结构——kobject
与sysfs文件系统绑定,每个kobject对应sysfs文件系统的一个目录(不是顶层目录,是子目录)
# 数据结构——kset
将kobject组织成一棵层次树。kset是同类型kobject结构的一个集合。
# 数据结构——subsystem
是同类kset的集合。
new device ---> kobject ---> kset --->subsystem --->subsystem --->...---> TheWholeSystem
·设备驱动程序模型的组件
# 设备<device> <===\
# 驱动程序<device_driver> <===\===> # 设备控制器
# 总线<bus_type> <===> # 接口
# 类<class>
——所有类对象都属于与/sys/class目录相对应的class_subsys子系统。每个类对象下面可能还有下一级子系统。
——设备驱动程序模型中的“类”本质上是要提供一个标准的方法,从而为向用户态APP导出裸机设备的接口。可见类<class>是设备驱动程序模型中的最高层、或者面向应用程序的一层。
——每个class_device描述符中含有一个kobject,这是一个设备文件(dev)。===》
===》 # 设备文件<device_file> APP直接访问硬件的入口
·设备文件的用户态处理
# 动态分配设备号
# 动态创建设备文件
·设备文件的VFS层处理(为APP隐藏设备文件与普通文件之间的差异正是VFS的责任。)
===========================================
·设备驱动程序
#注册设备驱动程序
#初始化设备驱动程序
#监控I/O操作
轮询模式
中断模式
#访问I/O共享存储器(I/O设备中的存储器<register RAM...>可以被映射到CPU统一编址中进行访问)
#直接内存访问(DMA)
——现代PC都提供辅助的DMA单元,能够代替CPU控制RAM和I/O设备存储器直接的数据传输。使用DMA最多的是磁盘和其它需要一次传输大量字节的设备。
============================================
·内核对设备的支持级别(参考见“·I/O设备与总线的硬件组织层次”这一段理解)
1、根本不支持。APP使用最基本的I/O指令与设备进行交互。
2、最小支持。不能识别设备(设备控制器),但能识别I/O接口(接口)。
3、扩展支持。不仅能是被I/O接口,也能是被设备本身(设备控制器)。