理论嵌入式linux要求

时间:2015-10-20 12:13:31

标签: raspberry-pi embedded-linux theory

我来自使用Java,C#,C ++,Javascript的程序员背景

我得到了我自己的Raspberry Pi(模型1 A,没有以太网的那个)并且用它玩了一会儿。我使用了Raspbian和Arch Linux ARM(因为据说它很小并且可以自定义)。不幸的是,我没有设法配置它们,因为我想拥有它们。

我正在尝试构建一个漂亮的(嵌入式)系统,唯一的目标是快速启动(启动)Raspberry Pi并自动启动一个将用C#(Mono),C ++(Qt),Java编写的测试应用程序( Java Runtime)或JavaScript / HTML中的东西。

由于我无法摆脱所有日志消息(我摆脱了最多),tty登录屏幕,尝试连接到网络(尽管模型1 A根本没有以太网)启动是丑陋的,需要很长时间(在某些情况下为+1分钟)。

似乎我必须构建一个最小的嵌入式Linux,但我缺乏嵌入式Linux元素的理论以及它们如何组合在一起。

我的问题:在raspberry pi上持有mono,qt,java运行时的嵌入式linux的理论上需要哪些部分?

到目前为止,我知道以下部分:

  • 硬件(raspberry pi型号1A)+ SD卡
  • sd卡包含2个分区,1个启动分区(fat32),1个数据分区(ext4)
  • 引导加载程序
  • 一个linux内核(可以根据raspi的需要进行优化)

但是呢?我的研究在"使用发行版"我不想要的。内核和启动应用程序之间缺少什么?

1 个答案:

答案 0 :(得分:2)

嵌入式Linux系统由许多不同的部分组成,这些部分与实现高效工作的目标相同。

理想情况下,这与常规GNU / Linux系统没有太大区别,但让我们详细了解通用嵌入式系统的构建模块。

对于以下说明,我假设为架构ARM。下面的内容可能与实现有所不同,但通常是商业嵌入式系统的常用轨道。

GNU / Linux嵌入式系统的块

  • 硬件

的SoC

SoC是所有处理发生的地方,它是整个系统的主要处理单元,也是唯一拥有"智能"的地方。它负责使用其他硬件并运行您的软件。

它由各种不同的子块组成:

  1. 核心+缓存+ MMU - " 真实"处理器,例如 ARM Cortex-A9 。选择SoC时,您会注意到的主要事项。 可以由例如共同进行像NEON一样的SIMD协处理器。
  2. 内部RAM - 通常非常小。用于启动序列的第一阶段。
  3. 各种"外围设备" - 通过某些互连连接 面料/巴士到核心。这些可以从简单的ADC扩展到3D图形加速器。这种IP核的示例是:USB,PCI-E,SGX等。
  4. 低功耗/实时协处理器 - 某些系统提供一个或多个协处理器,以帮助主Core实现具有实时任务(例如工业通信总线)或处理低功耗陈述。它/他们的架构可能(或不是)是Core的一个亲戚。
  5. 外部RAM

    SoC使用它来在系统引导之后和引导程序本身之间存储临时数据。它通常是嵌入式系统在常规操作中使用的内存。

    非易失性存储器 - 可选

    可能会或可能不会出现。在您的情况下,它是您提到的SD卡。在其他情况下,可以是NAND,NOR或SPI Dataflash存储器(或它们的任意组合)。

    当存在时,它通常是SoC将从中读取的常规数据源,并且通常存储系统工作所需的所有SW组件。 在某些应用程序中没有必要/有用。

    外围设备

    与上述内容无关的任何内容。 可以是MAC ID EEPROM,一些继电器,网络摄像头或任何你可能想象的东西。

    • 软件

      首先,我们介绍一下所谓的 bootchain ,这是一旦你启动SoC就会发生的事情 - 并且 - 告诉它 - 告诉它开始运行。在以下列表中,引导链是第1点到第4点的后续调用。

    除了特定/异国情调的实施外,它或多或少总是相同的:

    1. 引导ROM代码 - SoC中包含的一个小型(通常是屏蔽的 - 工厂印象)内存。 SoC在上电时首先要做的就是执行代码。 这段代码 - 通常根据外部配置引脚 - 决定所谓的"引导策略"或者"引导顺序",这是寻找要执行的附加代码的位置(以及以什么顺序)。

      合适的介质是不同的:USB存储设备,USB主机,SD卡,NAND,NOR,SPI数据闪存,以太网,UART等。 如果以上都不包含有效内容,则Boot ROM通常会发出SoC的软复位,依此类推。

      当然,介质中的代码不会在适当的位置执行:它会被复制到内部RAM中然后执行。
    2. [以下两个包含在我们称之为bootloader medium的内容]

      1. 第一阶段引导加载程序 - 它刚被Boot ROM复制到 SoC的内部RAM。必须足够小以适应那种记忆 (通常低于100kB)。这是必需的,因为Boot ROM不是 足够大,不知道SoC是什么样的外部RAM 附属于。

        具有初始化的重要功能 外部RAM和SoC的外部存储器接口,以及 其他可能感兴趣的外围设备(例如禁用看门狗 定时器)。完成后,它将下一个阶段复制到外部RAM和 执行它。根据上下文,可以称为MLO,SPL或 其他

      2. 第二阶段引导程序 - " main"引导程序。比第一阶段更大(可能是x10),完成初始化 相关外围设备(例如以太网,附加存储介质,LCD 显示)。

        为下一步做什么允许更复杂的逻辑 并提供 - 取决于软化水平 - 高水平 设施(文件系统/卷处理,数据 复制 - 移动 - 解释,LCD输出,交互式控制台,故障保护 策略)。

        大多数时候加载Linux内核(和相关的) 来自某种媒介的记忆并将相关信息传递给它(例如 如果没有嵌入,则对于较新的内核,放置DTB物理地址 在r2寄存器中 - 内核然后读取寄存器和 检索DTB)

      3. Linux内核 - 操作系统的核心。取决于 硬件平台可能是也可能不是主线("官方")版本。

        通常由内置或可加载(从外部完成)完成 源 - 免费或不是)模块。初始化整个系统根据硬编码配置工作所需的所有硬件和DT - 启用MMU,编排整个系统并以异常方式访问硬件。根据启动参数 (cmdline - 通常由前一阶段传递)和/或编译 选项,内核尝试挂载根文件系统。来自 rootfs,它会尝试加载一个init(即/ sbin / init - where / is 刚安装的rootfs)。

      4. Init和rootfs - init是第一个要运行的非内核任务, 有PID 1.它会使您需要使用的所有内容 系统。在生产嵌入式系统中,它也是主要的 应用。在这样的系统中是BusyBox或定制的 应用

      5. 有关rootfs和发行版的更多内容

        Rootfs包含所有非核心的GNU / Linux系统(除了/ lib / modules和其他位)。
        它包含管理以太网,WiFi或外部UMTS调制解调器等外围设备的所有应用程序。

        包含系统的交互式部分,包含用户界面以及启动GNU / Linux系统时所看到的所有内容 - 无论是否嵌入。

        A"发行版"只是一个特定的用户空间(非内核)程序和库(通常)经过验证,可以很好地与另一个一起工作,并由特定的人群组成。 桌面发行版通常还附带定制内核和引导加载程序。例如Fedora,Ubuntu,Debian等。

        从一般意义上说,没有什么可以阻止你创建自己的发行版,这是每次自定义嵌入式系统进入生产时发生的事情:通过Yocto或Buildroot等工具(或手工制作) ),事实上,您可以决定适合系统目的的软件的特定集合(因此发布,分发)。

        总结并完全回答您的问题您正在寻找的缺失部分是init和挂载rootfs的过程:内核挂载 - 也就是渲染通过其驱动程序和传递的/内置参数可以使用给定的卷/分区(你提到的ext4数据分区)到" /"装点。

        在这个卷/分区中有一个/ sbin / init可执行文件,内核执行它。

        这是" Big Bang "我们的GNU / Linux用户空间系统:一切可见的地方开始。根据配置脚本(通常位于/etc/init.d下)"应用程序"你提到的是由init自动运行,或者由用户通过终端/ ssh运行/无论是什么 - 再次 - init使你可以使用。

        我将在接下来的几个小时内添加引用,扩展和例外。