34

虽然单独理解每一个(或者可能不理解),但看起来我远未理解两者之间的实际差异。

根据我的理解,BSP 是一个驱动程序和配置设置包,它允许内核映像启动板(并且是板的一部分)。单个设备驱动程序在特定组件 (HW) 上运行,一方面与核心内核接口,另一方面与设备本身接口。

查看 Linux 内核,我不清楚 BSP 角色从哪里开始,设备驱动程序角色在哪里结束。具体来说,我习惯于在每个映像中看到每个板一个 BSP,但是,通用 Linux 内核可以加载到具有相同映像的任何体系结构系列上(很明显,对于不同的系列,有不同的映像:x86、amd64、arm、等...),根据需要从 initrd 加载特定的板和外围设备驱动程序。

是否有适用于常见 Linux 内核发行版的 BSP?还是 BSP 仅与特殊情况板相关?

这种行为在其他内核上是否类似?VxWorks?

最后一个,合并不同的 BSP/s 以生成适合不同板的单个图像是否常见?

4

6 回答 6

25

我将 BSP 和设备驱动程序之间的关系视为"has-a"。板级支持包包括设备驱动程序。

BSP 和内核之间的区别并不容易区分。内核将指令转换为硬件。内核通常是针对特定的硬件系列编写的,因此它们并不像看起来那样便携或通用。它相当于每个架构系列的代码的不同排列。

BSP 的作用正好相反:它提供工具和指令来使用该板的特定硬件集。在特定的受控情况下,内核可以完成这项工作。但是 BSP 允许任何兼容的内核/操作系统/应用程序堆栈通过遵循其配置说明来使用该板。

如果您只需要访问 CPU 周期和内存,也许是一些协议(USB、以太网、几种视频类型),具有广泛架构支持的内核非常棒,并且曾经有一段时间,硬件抽象的广度被倒数第二. 但是现在,考虑到电路板可能有一套传感器(加速度计、磁力计、陀螺仪、光线、接近度、大气压力等)、电话、可能有多个 CPU、多个 GPU 等。如果/当有人使用那些特定的硬件包时,可以编写一个内核来提供 VGA/DVI/HDMI/DisplayPort 和 CPU/GPU 组合的几种排列,但与使用专为特定电路板构建的 BSP。即使那样,那也只是一个内核;该板能够支持 Linux、Windows、Android、Symbian 等。

这就是为什么存在像Yocto这样的努力来进一步解耦内核和硬件的原因。BSP 使硬件集可扩展到一两个内核/操作系统/应用程序堆栈之外,而内核使特定的操作系统/应用程序堆栈可在多个硬件架构上移植

于 2014-03-27T23:01:15.397 回答
14

根据我的经验,BSP 的范围要大得多。它包括引导加载程序、rootfs、内核和驱动程序等,这意味着拥有 BSP 使您的主板能够自行启动。驱动程序使设备工作并且只是 BSP 的一部分。

驱动程序不等于 BSP。

于 2012-08-13T18:59:56.570 回答
7

如今,为了提高可重用性,事物都是模块化的,嵌入式系统的软件开发通常分为三层。

  • 内核(包含任务处理、调度、内存管理)
  • 堆栈(位于设备驱动程序的上层,为 I2C、SPI、以太网、SDIO、串行、文件系统、网络等提供协议实现)
  • BSP = 设备驱动程序(提供对硬件上任何控制器寄存器的访问,例如 I2C、SDIO、SPI、Ethernet_MAC、UART(串行)和中断处理 (ISR) 的寄存器。

板卡支持包(设备驱动程序)是软件层,它随着每块板卡的变化而变化,而其他两个软件层保持不变。

于 2017-05-03T10:39:53.610 回答
1

电路板支持包包括应用程序使用电路板所需的一切。其中包括板上设备的设备驱动程序和应用程序程序员的实用软件。多媒体板上也提供窗口环境。系统工程师可以进一步向电路板添加扩展。某些应用程序需要重新实现 bsp 的某些部分以进行增强。在这里,bsp 起到了参考实现或此类需求起点的作用。

混乱在于商业模式。参考板或开发板不是移动设备等终端/消费产品。它在设计和开发 iPhone 或三星 Galaxy 等产品方面发挥着重要作用。

在大多数情况下,通用 bsp 将缺乏优化,因此您只能期望为新手模型或优化留给您完成的地方使用通用 bsp。如果是便宜的板子,bsp 是相当通用的,因为生产商将对其投入较少的投资。

不要在内核和用户空间方面过分强调,因为也有微内核可用。这里的驱动程序是用户空间的一部分!再次考虑一个只有一段代码而没有任何内核的低功耗板。所以它归结为支持董事会完成工作的软件。

于 2015-01-04T00:30:26.163 回答
1

板卡支持包和 HAL(硬件抽象层)之间存在概念上的联系,设备驱动程序/内核模块执行硬件抽象,板卡支持包为设备驱动程序提供接口或者是硬件抽象层本身.

所以基本上BSP 具有类似于 DOS 时代的 BIOS 的功能

此外,BSP 应该执行以下操作

  • 初始化处理器
  • 初始化总线
  • 初始化中断控制器
  • 初始化时钟
  • 初始化 RAM 设置
  • 配置段
  • 从闪存加载和运行引导加载程序

来自:https ://en.wikipedia.org/wiki/Board_support_package

现代 PC 中的 BIOS 初始化和测试系统硬件组件,并从大容量存储设备加载引导加载程序,然后初始化操作系统。在 DOS 时代,BIOS 为键盘、显示器和其他输入/输出 (I/O) 设备 [设备驱动程序] 提供了一个硬件抽象层,用于标准化应用程序和操作系统的接口。较新的操作系统在加载后不使用 BIOS,而是直接访问硬件组件。

来源:https ://en.wikipedia.org/wiki/BIOS

另一方面是设备树在 BSP 中的使用,设备树是描述机器硬件的统一或标准化概念:

U-boot 引导加载程序并准备发货

Doug Abbott,用于嵌入式和实时应用程序的 Linux(第四版),2018 年

设备树

将 Linux 等操作系统移植到新平台的最大问题之一是硬件描述。这是因为硬件描述分散在几十个左右的设备驱动程序、内核和引导加载程序中,仅举几例。 最终的结果是,这些不同的软件对每个平台来说都是独一无二的,配置选项的数量增加了,每块板都需要一个独特的内核映像。

已经有许多方法来解决这个问题。“板级支持包”或 BSP 的概念试图将所有硬件相关代码收集到一个地方的几个文件中。可以说arch/Linux 内核源代码树的整个子树是一个巨大的板级支持包。

看一下arch/arm/内核的子树。在那里,您会发现大量目录,格式为mach-*plat-*,大概分别是“机器”和“平台”的缩写。这些目录中的大多数文件都为 ARM 体系结构的特定实现提供了配置信息。当然,每个实现都以不同的方式描述其配置。

拥有一种可以用来明确描述计算机系统硬件的单一语言不是很好吗?这是设备树的前提和承诺。

系统中的外围设备可以沿多个维度进行表征。例如,字符设备与块设备。有内存映射设备,以及通过 I2C 或 USB 等外部总线连接的设备。然后是平台设备和可发现设备。

可发现设备是那些存在于外部总线上的设备,例如 PCI 和 USB,它们可以告诉系统它们是什么以及它们是如何配置的。也就是说,它们可以被内核“发现”。识别设备后,加载相应的驱动程序是一件相当简单的事情,然后它会询问设备以确定其精确配置。

另一方面,平台设备缺乏任何机制来识别自己。诸如 Sitara 之类的片上系统 (SoC) 实现充斥着这些平台设备——系统时钟、中断控制器、GPIO、串行端口等等。设备树机制对于管理平台设备特别有用。

设备树的概念是在内核的 PowerPC 分支中演变而来的,这似乎是它使用最多的地方。事实上,现在要求所有 PowerPC 平台在启动时将设备树传递给内核。设备树的文本表示是一个扩展名为 .dts 的文件。这些 .dts 文件通常位于内核源代码树的arch/$ARCH/boot/dts.

设备树是描述计算机系统的设备集合和互连总线的分层数据结构。它被组织为从由“<code>/”表示的根开始的节点,就像根文件系统一样。每个节点都有一个名称,并由名称-值对的“属性”组成。它还可能包含“子”节点。

清单 15.1 是一个来自 devicetree.org 网站的示例设备树。除了说明结构之外,它什么也没做。这里我们有两个节点,分别命名为 node1 和 node2。node1 有两个子节点,node2 有一个子节点。属性由 name=value 表示。值可以是字符串、字符串列表、用方括号括起来的一个或多个数值,或者用尖括号括起来的一个或多个“单元格”。如果属性通过其存在或不存在来传达布尔值,则该值也可以为空。

来源:https ://www.sciencedirect.com/topics/computer-science/board-support-package

通过设备树覆盖内核模块可以在启动时加载,即在 RPi 上添加dtoverlay=lirc-rpi/boot/config.txt加载lirc-pi内核模块/设备驱动程序:

未来的默认 config.txt 可能包含如下部分:

 # Uncomment some or all of these to enable the optional hardware interfaces
 #dtparam=i2c_arm=on
 #dtparam=i2s=on
 #dtparam=spi=on

如果您有一个定义了一些参数的叠加层,则可以在后续行中指定它们,如下所示:

 dtoverlay=lirc-rpi 
 dtparam=gpio_out_pin=16 
 dtparam=gpio_in_pin=17
 dtparam=gpio_in_pull=down

来源:https ://www.raspberrypi.org/documentation/configuration/device-tree.md

当使用 Yocto 构建 BSP 时,所有分散在设备驱动程序、内核、引导加载程序等的硬件信息都被收集起来,这里是开发人员指南如何在 Yocto 中完成此操作https://www.yoctoproject.org /docs/2.5/bsp-guide/bsp-guide.html

[Yocto 文档]... 声明 BSP “...仅关注特定于硬件的组件。在最终分发点,您可以将 BSP 与构建系统和其他工具结合使用。但是,重要的是要保持区别,即这些是碰巧组合在某些最终产品中的独立组件。”</p>

来源:https ://www.microcontrollertips.com/board-support-package/

于 2020-02-01T11:05:41.603 回答
-1

驱动程序是一个程序,它向内核说明设备的行为……设备可能是 USB 设备或相机或蓝牙,也可以是任何东西。根据操作的大小我们分为三个字符,块,网络。但它只允许访问每个设备......它只配置设备而不配置内存,Cpu速度。它没有给出该处理器或控制器的指令。它在该处理器或控制器上工作。谁启用定义功能的微控制器,......谁给出微控制器的起点......谁给出指令。现在来了像 BSP 这样的答案............ Bsp 是一个支持引导加载程序的板级支持包。它给出了系统的行为。考虑两种情况,1。

  1. 在这种情况下,我有一台带操作系统的电脑,所以我不需要考虑系统的行为。所以我只需使用系统操作系统启用设备的行为

  2. 在此,板意味着具有所有外围设备的处理器......在这种情况下没有操作系统,所以我们需要制作或者我们需要启用该设备的行为......

于 2019-06-20T05:21:47.417 回答