<2012 11 15> Linux内核驱动总体框架——《深入理解Linux内核》chapter 13 读书笔记


·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接口,也能是被设备本身(设备控制器)。

 

 

 

你可能感兴趣的:(linux)