设备树概述【转】

转自:http://docs.oracle.com/cd/E38902_01/html/E38873/kernelovr-64300.html

设备树概述

Oracle Solaris OS 中的设备表示为互连的设备信息节点树。设备树描述特定计算机的已装入设备的配置。

设备树组件

系统将会生成树结构,其中包含有关引导时连接到计算机的设备的信息。此外,系统正常运行时也可以动态重新配置设备树。设备树从表示平台的根设备节点开始。

根节点下面是设备树的分支。分支由一个或多个总线结点设备和一个终止叶设备组成。

总线结点设备可为设备树中的从属设备提供总线映射和转换服务。PCI-PCI 网桥、PCMCIA 适配器和 SCSI HBA 都是结点设备的示例。编写结点设备驱动程序的讨论仅限于 SCSI HBA 驱动程序的开发(请参见第 18 章)。

叶设备通常为外围设备,如磁盘、磁带、网络适配器、帧缓存器等。叶设备驱动程序可以导出传统的字符驱动程序接口和块驱动程序接口。通过这些接口,用户进程可在存储设备或通信设备中读取和写入数据。

系统通过以下步骤来生成树:

  1. CPU 经过初始化后搜索固件。
  2. 主要固件(OpenBoot、基本输入/输出系统 (Basic Input/Output System, BIOS) 或 Bootconf)初始化并创建包含已知或自标识硬件的设备树。
  3. 当主要固件在设备中发现兼容固件时,主要固件将初始化该设备并检索设备属性。
  4. 该固件将查找并引导操作系统。
  5. 内核从树的根节点开始,搜索匹配的设备驱动程序并将该驱动程序绑定到设备。
  6. 如果设备是结点,则内核会查找固件尚未检测到的子设备。内核会将所有子设备都添加到树的子树节点下面。
  7. 内核从步骤 5 开始重复该过程,直到无需再创建设备节点。

每个驱动程序都会导出设备操作结构 dev_ops(9S),以定义设备驱动程序可以执行的操作。设备操作结构包含通用操作(如 attach(9E)detach(9E) 和 getinfo(9E))的函数指针。该结构同时还包含了一组与特定总线结点驱动程序操作相关的函数指针,以及一组与特定叶结点设备驱动程序操作相关的函数指针。

树结构将在节点之间创建父子关系。此父子关系是体系结构无关性的关键。当叶驱动程序或总线结点驱动程序本质上需要依赖于体系结构的服务时,该驱动程序会请求其父级提供该服务。采用此方法,不管计算机或处理器的体系结构是什么,驱动程序都可以正常运行。下图显示了典型的设备树。

图 2-2 示例设备树

子树节点可以有一个或多个子节点。叶节点表示各个设备。

显示设备树

设备树可以采用以下三种方式显示:

  • libdevinfo 库提供访问设备树内容的编程接口。
  • prtconf(1M) 命令显示设备树的完整内容。
  • /devices 分层结构是设备树的表示形式。使用 ls(1) 命令查看该分层结构。


注 - /devices 仅显示将驱动程序配置到系统中的设备。prtconf(1M) 命令显示所有设备节点,而不管系统中是否存在设备驱动程序。


libdevinfo 库

libdevinfo 库提供用于访问所有公共设备配置数据的接口。有关接口列表,请参见 libdevinfo(3LIB) 手册页。

prtconf 命令

以下摘录的 prtconf(1M) 命令示例显示了系统中的所有设备。

System Configuration:  Sun Microsystems  sun4u
Memory size: 128 Megabytes
System Peripherals (Software Nodes):

SUNW,Ultra-5_10
    packages (driver not attached)
        terminal-emulator (driver not attached)
        deblocker (driver not attached)
        obp-tftp (driver not attached)
        disk-label (driver not attached)
        SUNW,builtin-drivers (driver not attached)
        sun-keyboard (driver not attached)
        ufs-file-system (driver not attached)
    chosen (driver not attached)
    openprom (driver not attached)
        client-services (driver not attached)
    options, instance #0
    aliases (driver not attached)
    memory (driver not attached)
    virtual-memory (driver not attached)
    pci, instance #0
        pci, instance #0
            ebus, instance #0
                auxio (driver not attached)
                power, instance #0
                SUNW,pll (driver not attached)
                se, instance #0
                su, instance #0
                su, instance #1
                ecpp (driver not attached)
                fdthree, instance #0
                eeprom (driver not attached)
                flashprom (driver not attached)
                SUNW,CS4231 (driver not attached)
            network, instance #0
            SUNW,m64B (driver not attached)
            ide, instance #0
                disk (driver not attached)
                cdrom (driver not attached)
                dad, instance #0
                sd, instance #15
        pci, instance #1
            pci, instance #0
                pci108e,1000 (driver not attached)
                SUNW,hme, instance #1
                SUNW,isptwo, instance #0
                    sd (driver not attached)
                    st (driver not attached)
                    sd, instance #0 (driver not attached)
                    sd, instance #1 (driver not attached)
                    sd, instance #2 (driver not attached)
                    ...
    SUNW,UltraSPARC-IIi (driver not attached)
    SUNW,ffb, instance #0
    pseudo, instance #0

/devices 目录

/devices 分层结构提供了表示设备树的名称空间。下面是 /devices 名称空间的缩写列表。样例输出对应于先前显示的示例设备树和 prtconf(1M) 输出。

/devices
/devices/pseudo
/devices/[email protected],0:devctl
/devices/SUNW,[email protected],0:ffb0
/devices/[email protected],0
/devices/[email protected],0/[email protected],1
/devices/[email protected],0/[email protected],1/SUNW,[email protected]:m640
/devices/[email protected],0/[email protected],1/[email protected]:devctl
/devices/[email protected],0/[email protected],1/[email protected]:scsi
/devices/[email protected],0/[email protected],1/[email protected]
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],724000:power_button
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:a
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:b
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:0,hdlc
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:1,hdlc
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:a,cu
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],400000:b,cu
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],3043bc:ecpp0
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],3023f0:a
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],3023f0:a,raw
/devices/[email protected],0/[email protected],1/[email protected]/SUNW,[email protected],200000:sound,audio
/devices/[email protected],0/[email protected],1/[email protected]/SUNW,[email protected],200000:sound,audioctl
/devices/[email protected],0/[email protected],1/[email protected]
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],0:a
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],0:a,raw
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],0:a
/devices/[email protected],0/[email protected],1/[email protected]/[email protected],0:a,raw
/devices/[email protected],0/[email protected]
/devices/[email protected],0/[email protected]/[email protected]
/devices/[email protected],0/[email protected]/[email protected]/SUNW,[email protected]:devctl
/devices/[email protected],0/[email protected]/[email protected]/SUNW,[email protected]:scsi

将驱动程序绑定到设备

除了构造设备树之外,内核还可确定用于管理设备的驱动程序。

将驱动程序绑定到设备指的是系统选择用于管理特定设备的驱动程序的过程。绑定名称是将驱动程序与设备信息树连接在一起的唯一设备结点名称。对于设备树中的每个设备,系统都会尝试从已安装的驱动程序列表中选择一个驱动程序。

每个设备节点都有关联的 name 属性。可以在系统引导期间通过外部代理(如 PROM )或通过 driver.conf 配置文件指定此属性。无论在哪种情况下,name 属性都表示指定给设备树中的设备的节点名称节点名称是在 /devices 中可见并列在 prtconf(1M) 输出中的名称。

图 2-3 设备节点名称

设备节点也可以有关联的 compatible 属性。compatible 属性包含设备的一个或多个可能的驱动程序名称或驱动程序别名的有序列表。

系统使用 compatible 属性和 name 属性来为设备选择驱动程序。如果 compatible 属性存在,则系统会首先尝试将 compatible 属性的内容与系统中的驱动程序匹配。系统将从 compatible 属性列表的第一个驱动程序名称开始,尝试将该驱动程序名称与系统中的已知驱动程序匹配。系统将会处理该列表中的每一项,直到找到匹配项或者到达列表结尾。

如果 name 属性或 compatible 属性的内容与系统中的某个驱动程序匹配,则将该驱动程序绑定到设备节点。如果未找到匹配项,则不会将任何驱动程序绑定到设备节点。

通用设备名称

某些设备将通用设备名称指定为 name 属性的值。通用设备名称用于描述设备的功能,不实际标识设备的特定驱动程序。例如,SCSI 主机总线适配器可能具有通用设备名称 scsi。以太网设备可能具有通用设备名称 ethernet

通过 compatible 属性,系统可以确定具有通用设备名称的设备的备用驱动程序名称,例如,glm 对应于 scsi HBA 设备驱动程序,hme 对应于 ethernet 设备驱动程序。

具有通用设备名称的设备需要提供 compatible 属性。



注 - 有关通用设备名称的完整说明,请参见 IEEE 1275 Open Firmware Boot Standard 固件引导标准。


下图显示了具有特定设备名称的设备节点。驱动程序绑定名称 SUNW,ffb 与设备节点名称同名。

图 2-4 特定驱动程序节点绑定

下图显示了具有通用设备名称 display 的设备节点。驱动程序绑定名称 SUNW,ffb 是 compatible 属性驱动程序列表中与系统驱动程序列表中的驱动程序匹配的第一个名称。在这种情况下,display 是帧缓存器的通用设备名称。

图 2-5 通用驱动程序节点绑定


版权所有 © 1992, 2013, Oracle 和/或其附属公司。 保留所有权利。 法律声明
时间: 2024-10-12 01:07:00

设备树概述【转】的相关文章

我眼中的Linux设备树(二 基础规范概述)

二 基础规范概述 DTS(Device tree syntax,另一种说法是Device tree source)是设备树源文件,为了方便阅读及修改,采用文本格式.DTC(Device tree compiler)是一个小工具,负责将DTS转换成DTB(Device tree blob).DTB是DTS的二进制形式,供机器使用.使用中,我们首先根据硬件修改DTS文件,然后在编译的时候通过DTC工具将DTS文件转换成DTB文件,然后将DTB文件烧写到机器上(如emmc,磁盘等存储介质).系统启动时

我眼中的Linux设备树(一 概述)

一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡ARM平台应该参考其他平台如PowerPC的设备树机制描述硬件.因为在此之前,ARM平台还是采用旧的机制,在kernel/arch/arm/plat-xxx目录和kernel/arch/arm/mach-xxx目录下用代码描述硬件,如注册platform设备,声明设备的resource等.因为这些代

基于设备树的TQ2440的中断(1)

作者 姓名:彭东林 E-mail:[email protected] QQ:405728433 平台 板子:TQ2440 内核:Linux-4.9 u-boot: 2015.04 工具链: arm-none-linux-gnueabi-gcc 4.8.3 概述 在博文讓TQ2440也用上設備樹(1)将支持devicetree的Linux4.9移植到了tq2440上面,而在基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)中介绍了最新的Linux下中断的知识,下面我们再

基于设备树的controller学习(1)

作者 彭东林[email protected] 平台 TQ2440Linux-4.10.17 概述 在设备树中我们经常见到诸如"#clock-cells"."#dma-cells"."#reset-cells"."#phy-cells"."#iommu-cells"."#pwm-cells"."#hwlock-cells"."#io-channel-cell

迅为iTOP-iMX6开发板-设备树内核-中断例程

1.1 中断概述 ARM 架构 linux 内核中,有 5 种常见的异常,其中中断异常是其一,Linux 内核将所 有中断统一编号,使用一个 irq_desc 结构体来描述这些中断,里面记录了中断名称.中断状 态.中断标记.并提供了中断的底层硬件访问函数(如:清除.屏蔽.使能中断),提供了这 个中断的处理函数入口,通过它还可以调用用户注册的的中断处理函数.linux 内核的中断体 系已经很完善了,驱动工程师需要做的就是调用 request_irq 函数向内核注册中断处理函 数,下面我们来看看 r

设备树API

设备树API通常以of_开头,实现代码位于drivers/of目录下. 参考: 1. linux设备树语法 2. ARM Linux 3.x的设备树(Device Tree)

Linux设备树语法详解

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码.比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的

zynq基础-->LINUX 设备树

1.概念 linux设备树是用于描述硬件及部分启动指令的文件,由bootloader传递给内核, 内核分析此文件而对硬件使用不同的参数. 比如两块开发板仅仅是内存容量不一样,那么就只需要修改设备树中对内存容量的描述即可, 而不需要重新编译内核. 与设备树相关的文件有如下几种: DTS(device tree source) .dts文件,就是ASCII字符串形式的文本文件,直接由开发人员修改. 对于ARM架构而言,这些文件位于:arch/arm/boot/dts 目录下. DTSI(device

【Linux-设备树】设备树

Linux3.1之前的版本,对于一般的ARM平台的设备,板级信息一般存放在/arch/arm/mach-**目录下. 设备树对应的文件存放在/arch/arm/boot/dts/***.dts目录下 设备树引入的目的: 避免各个厂商代码的重复,加速linux内核的bsp的开发.编译一个镜像可以支持多个不同设备,只需要编译对应的设备树并打包就可以. 设备树:是一种描述板子硬件信息的数据结构(二进制文件),通过lk(bootloader)加载不同(对应的内核). 内容:dts源文件----dtc编译