# 入门

本文档是[Driver Development Kit教程](ddk-tutorial.md)文档的一部分。

编写设备驱动程序通常被视为一项艰巨的任务,充满了复杂性,并且需要鲜为人知的内核机密的晦涩知识。

本节的目标是揭开这一过程的神秘面纱;你会学到一切需要知道的如何编写设备驱动程序的知识。从他们的工作开始,它们如何起作用,以及它们如何适应整个系统。

##概述

在最高级别,设备驱动程序的工作是为特定设备提供统一的接口,同时隐藏特定于设备实现的细节。

例如,两个不同的以太网驱动程序都允许客户端发送数据包,使用完全相同的C语言函数输出接口。每个驱动程序都负责管理自己的硬件,但是,即使硬件不同,客户端接口相同。

请注意,驱动程序提供的接口可能是“中间”&mdash层面的。也就是说,它们可能不一定代表链中的“最终”设备。

考虑一个基于PCI的以太网设备。
首先,需要基本PCI驱动程序,了解如何与PCI总线本身通信。
这个驱动程序对以太网一无所知,但确实知道如何与处理机器上的特定PCI芯片组通信。

它枚举该总线上的设备,收集来自每个设备上的各种寄存器信息,并提供允许其客户端(如基于PCI的以太网驱动程序)执行PCI操作的功能,比如分配中断或DMA通道。

因此,这个基本PCI驱动程序为以太网驱动程序提供服务,以太网驱动程序来管理其相关硬件。

同时,其他设备(如视频卡)也可以使用基本PCI驱动程序以类似的方式管理其硬件。

##zircon模型

为了提供最大的灵活性,Zircon世界的驱动允许绑定到匹配的“父”设备,并发布自己的“儿子”。
此层次结构根据需要进行扩展:一个驱动程序可能只发布一个子项,另一个驱动程序认为该子项是其parent,第二个驱动程序发布自己的child,等等。

为了理解其工作原理,让我们按照基于PCI的以太网示例进行操作。

系统首先提供一个特殊的“PCI root”父级。
实际上,它说的是“我知道当你在这个系统上有一个PCI总线,当你找到它时,把它绑定在*这里*。“

>下面的“高级主题”部分提供了有关此过程的更多详细信息。

驱动程序由系统(搜索目录)和驱动程序进行评估匹配自动绑定。

在这种情况下,绑定到“PCI root”父级的驱动程序找到了,并绑定了。

这是基本的PCI驱动程序。它的工作是配置PCI总线,并枚举总线上的外设。

PCI总线具有关于如何识别外围设备的特定约定:
供应商ID(** VID **)和设备ID(** DID **)的组合是所有可能的PCI设备的唯一标识。
在枚举期间,将从外设和新父级读取这些值,发布包含检测到的VID和DID(以及其他主机)的节点信息)。

每次发布新设备时,都会执行与上述相同的重复过程(像最初的PCI root设备发布一样);
也就是说,系统会评估驱动程序,搜索匹配的驱动程序是否符合新父母的特点。

而对于PCI根设备,我们之前在搜索匹配某种功能(称为“协议”,我们很快就会看到这一点)的驱动程序,但是,在这种情况下,我们将搜索匹配不同协议的驱动程序,即满足“是一个PCI设备且有给定的VID和DID”的协议要求。

如果找到合适的驱动程序(一个匹配所需的协议,VID和DID),它将与父母绑定。

作为绑定的一部分,我们初始化驱动程序—这涉及此类操作,如设置card进行操作,启动接口,和发布此设备的一个或多个子设备。
对于PCI以太网驱动程序,它发布“以太网”接口,同时符合另一种协议,称为“以太网实现”协议。
该协议代表了一种与客户使用(但删除了一步;我们将回到此处)功能相近的通用协议。

###协议

我们上面提到了三个协议:

* PCI根协议(`ZX_PROTOCOL_PCIROOT`),
* PCI设备协议(`ZX_PROTOCOL_PCI`),和
*以太网实现协议(`ZX_PROTOCOL_ETHERNET_IMPL`)。

括号中的名称是与协议对应的C语言常量,供参考。

什么是协议?

协议是严格的接口定义。

以太网驱动程序发布了一个符合`ZX_PROTOCOL_ETHERNET_IMPL`的接口。
这意味着它必须提供在数据结构中定义的一组函数(在本案例中是`ethmac_protocol_ops_t`)。

这些功能对于实现协议的所有设备都是通用的 -  mdash;例如,
所有以太网设备必须提供查询该MAC地址功能的接口。

其他协议当然对它们的功能有不同的要求,必须提供。
例如,块设备将发布符合“块实现协议”(`ZX_PROTOCOL_BLOCK_IMPL`)的接口,必须提供`block_protocol_ops_t`定义的函数。
该协议包括一个以块为单位返回设备大小的函数。

我们将在以下章节中研究这些协议。

#高级主题

上面介绍了zircon驱动器的全景图,重点是协议。

在本节中,我们将研究一些高级主题,例如平台相关的主题和平台无关的代码解耦,
“杂项”协议,以及协议和进程的映射方式。

##平台依赖与平台无关

上面,我们提到`ZX_PROTOCOL_ETHERNET_IMPL`是“接近”由客户端使用的函数,但这个接口将会被删除。那是因为还有一个协议,`ZX_PROTOCOL_ETHERNET`,介于客户端和驱动两者之间。
此附加协议用于处理所有以太网驱动程序的通用函数(以避免代码重复)。
此类功能包括缓冲区管理,状态报告和管理功能。

这实际上是“平台依赖”与“平台无关”的解耦;
公共代码存在于平台独立部分(一次),而特定于驱动程序的代码在平台相关部分中实现。

这种架构(套路)在多个地方都有使用。
例如,对于块设备,硬件驱动程序绑定到总线(例如,PCI),并提供`ZX_PROTOCOL_BLOCK_IMPL`协议。
独立于平台的驱动程序绑定到`ZX_PROTOCOL_BLOCK_IMPL`,并发布面向客户的协议,`ZX_PROTOCOL_BLOCK`。

您还可以通过显示控制器,I<sup>2</sup>C总线和串行驱动程序看到这一点。

##杂项协议

在[simple drivers](simple.md)中,我们展示了几个驱动程序的代码基本功能,但不提供与特定协议相关的服务(即,它们不是“以太网”或“块”设备)。
这些驱动程序绑定到`ZX_PROTOCOL_MISC_PARENT`。

> @@@更多内容?

##进程/协议映射

为了使讨论保持简单,我们没有讨论进程分离,因为它与驱动有关。
要了解这些问题,让我们看看其他操作系统如何处理它们,并将其与zircon方法进行比较。

在宏内核(如Linux)中,许多驱动程序都在内核中实现。
这意味着它们共享相同的地址空间,并且有效地生活在同一个“进程”中。

这种方法的主要问题是故障隔离/利用。
坏驱动程序可以取出整个内核,因为它位于同一个地址空间中,因此具有对所有内核内存和资源的特权访问。
受损的驱动程序可能出于同样的原因而出现安全威胁。

另一个极端,在一些微内核操作系统中,将每个驱动程序服务都放在自己的进程中。
它的主要缺点是如果一个驱动程序依赖于另一个驱动程序的服务,
内核至少会影响两个驱动进程的上下文切换操作(如果不是数据传输)。
虽然微内核操作系统通常对这种操作设计得很快,但是高频率的调用它们也是不合需求的。

Zircon采用的方法基于设备主机(** devhost **)的概念。
devhost是一个包含协议栈的进程&mdash;也就是说,一个或更多协同工作的协议。
devhost从ELF共享库加载驱动程序(称为动态共享对象,或** DSO **)。
在[simple drivers](simple.md)部分中,我们将看到meta信息包含在DSO中以加快发现过程。

协议栈有效地允许为设备创建完整的“驱动程序”,由平台相关和平台独立组件组成,在一个独立的过程容器中。

对于高级阅读器,请查看Zircon命令行可用的`dm dump`命令。
它显示设备树,并显示进程ID,DSO名称和其他有用的信息。

这是一个高度编辑的版本,仅显示PCI以太网驱动程序部分:

```
1. [root]
2.    [sys]
3.       <sys> pid=1416 /boot/driver/bus-acpi.so
4.          [acpi] pid=1416 /boot/driver/bus-acpi.so
5.          [pci] pid=1416 /boot/driver/bus-acpi.so
            ...
6.             [00:02:00] pid=1416 /boot/driver/bus-pci.so
7.                <00:02:00> pid=2052 /boot/driver/bus-pci.proxy.so
8.                   [intel-ethernet] pid=2052 /boot/driver/intel-ethernet.so
9.                      [ethernet] pid=2052 /boot/driver/ethernet.so
```

从上面可以看到进程ID“1416”(第3到6行)是"高级配置和电源接口"(** ACPI **)驱动程序,
通过DSO`bus-acpi.so`实现。

在主枚举期间,ACPI DSO检测到PCI总线。
这导致parent发布了`ZX_PROTOCOL_PCI_ROOT`(第5行,导致`[pci]`条目的出现)
然后导致devhost加载`bus-pci.so` DSO并绑定到它。
DSO是我们上面讨论的在整个过程中引用的“基本PCI驱动程序”。

在绑定期间,基本PCI驱动程序枚举了PCI总线,并找到了以太网卡(第6行检测总线0,设备2,功能0,显示为“[00:02:00]”)。
(当然,还发现了许多其他设备,但简单起见,我们已将它们从上面列出中移除)。

然后,检测到此设备会导致基本PCI驱动程序发布使用`ZX_PROTOCOL_PCI`和设备的VID和DID新parent。
此外,创建了一个新的devhost(进程ID“2052”)并加载了`bus-pci.proxy.so` DSO(第7行)。
此代理充当从新devhost(pid`2052`)到基本PCI驱动(pid`1416`)的接口。

>这是“切断”设备驱动程序只在自己进程的地方&mdash;新的devhost和基本的PCI驱动程序现在在两个不同的进程中。

新的devhost`2052`然后找到一个匹配的child(`intel-ethernet.so`第8行的DSO;它被认为是匹配的,因为它有'ZX_PROTOCOL_PCI`和正确VID和DID)。
DSO发布了一个`ZX_PROTOCOL_ETHERNET_IMPL`,它绑定到一个匹配的child(第9行的`ethernet.so` DSO;它被认为是匹配的,因为它有一个`ZX_PROTOCOL_ETHERNET_IMPL`协议)。

这个链没有显示的是最终的DSO(`ethernet.so`)发布了一个`ZX_PROTOCOL_ETHERNET`&mdash;这是客户端可以使用的部分,所以当然不会涉及进一步的“设备”绑定。

zircon ddk快速入门相关推荐

  1. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  2. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  3. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  4. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  5. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

  6. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  7. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  8. OpenStack快速入门

    OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助读者建立起一份OpenStack最小化安装.我是五岳之巅,翻译中多采用意译法,所以个别词与原版有出入,请大家谅解.我 ...

  9. Expression Blend实例中文教程(2) - 界面快速入门

    上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...

  10. 图文并茂!60页PPT《快速入门python数据分析路线》(附链接)

    一个月不走弯路快速入门学python和python数据分析路线,呕心沥血加班加点做了2天,一共63页,该课件讲的都是路线中的核心知识,今天把该PPT分享给大家,能根据该课件提到的知识有针对性的学,做到 ...

最新文章

  1. LeetCode Binary Tree Right Side View(搜索)
  2. 大话设计模式(十四 设计模式不能戏说!设计模式怎就不能戏说?)
  3. 大数据如何预测上市公司的业绩?
  4. Android studio百度地图的使用
  5. python3字符串常用操作
  6. 如何用golang获取linux上文件的访问/创建/修改时间
  7. jQuery移出style
  8. 紧急!Log4j2 再再爆雷:刚升级,又连爆 “核弹级” 远程数据泄露 ! v2.17.0 横空出世。。。...
  9. 使开发更便捷——Visual Studio 使用技巧——快捷键
  10. php如何实现自动加载mp3,如何简单的实现php自动加载
  11. 线程安全问题?怎么解决线程安全
  12. 软件测试创业公司和大厂外包如何选择?
  13. Linux文件编辑命令vi详细说明
  14. 第一单元 用python学习微积分(三) 求导四则运算及三角函数(下)- 三角函数
  15. POJ1201/ZOJ1508/HDU1384 Intervals(spfa解差分约束问题)
  16. 圣诞礼物c语言代码大全,圣诞节到咯,教大家用C语言画个圣诞树
  17. Linux下操作Excel表格,xlsx表格
  18. 基于javaweb的医院病历信息管理系统(java+ssm+jsp+bootstrap+easyui+mysql)
  19. 清理Git提交记录最简单的方法
  20. 微信小程序云开发——HbuilderX(数据库)

热门文章

  1. python代码混淆工具_Intensio-Obfuscator:一款专业Python代码混淆处理工具
  2. TongWeb8知识总结
  3. 去掉韩版 lg 锁屏双时钟 删除预装软件 适用安卓10
  4. [GIS教程] 6.1空间数据采集与处理具体步骤
  5. IT营最新Node.js入门到实战项目视频教程免费下载
  6. Excel构建决策分析模型
  7. Zotero IEEE trans期刊cls格式调整
  8. 论文模型构建的步骤_论文实证经验分享|VAR模型实操步骤(下)
  9. java实习实训管理系统ssm
  10. 群控系统linux脚本,万能安卓群控脚本助手(安卓群控软件)V1.1 最新版