我来自使用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的理论上需要哪些部分?
到目前为止,我知道以下部分:
但是呢?我的研究在"使用发行版"我不想要的。内核和启动应用程序之间缺少什么?
答案 0 :(得分:2)
嵌入式Linux系统由许多不同的部分组成,这些部分与实现高效工作的目标相同。
理想情况下,这与常规GNU / Linux系统没有太大区别,但让我们详细了解通用嵌入式系统的构建模块。
对于以下说明,我假设为架构ARM。下面的内容可能与实现有所不同,但通常是商业嵌入式系统的常用轨道。
SoC是所有处理发生的地方,它是整个系统的主要处理单元,也是唯一拥有"智能"的地方。它负责使用其他硬件并运行您的软件。
它由各种不同的子块组成:
SoC使用它来在系统引导之后和引导程序本身之间存储临时数据。它通常是嵌入式系统在常规操作中使用的内存。
可能会或可能不会出现。在您的情况下,它是您提到的SD卡。在其他情况下,可以是NAND,NOR或SPI Dataflash存储器(或它们的任意组合)。
当存在时,它通常是SoC将从中读取的常规数据源,并且通常存储系统工作所需的所有SW组件。 在某些应用程序中没有必要/有用。
与上述内容无关的任何内容。 可以是MAC ID EEPROM,一些继电器,网络摄像头或任何你可能想象的东西。
除了特定/异国情调的实施外,它或多或少总是相同的:
[以下两个包含在我们称之为bootloader medium的内容]
第一阶段引导加载程序 - 它刚被Boot ROM复制到
SoC的内部RAM。必须足够小以适应那种记忆
(通常低于100kB)。这是必需的,因为Boot ROM不是
足够大,不知道SoC是什么样的外部RAM
附属于。
具有初始化的重要功能
外部RAM和SoC的外部存储器接口,以及
其他可能感兴趣的外围设备(例如禁用看门狗
定时器)。完成后,它将下一个阶段复制到外部RAM和
执行它。根据上下文,可以称为MLO,SPL或
其他
第二阶段引导程序 - " main"引导程序。比第一阶段更大(可能是x10),完成初始化
相关外围设备(例如以太网,附加存储介质,LCD
显示)。
为下一步做什么允许更复杂的逻辑
并提供 - 取决于软化水平 - 高水平
设施(文件系统/卷处理,数据
复制 - 移动 - 解释,LCD输出,交互式控制台,故障保护
策略)。
大多数时候加载Linux内核(和相关的)
来自某种媒介的记忆并将相关信息传递给它(例如
如果没有嵌入,则对于较新的内核,放置DTB物理地址
在r2寄存器中 - 内核然后读取寄存器和
检索DTB)
Linux内核 - 操作系统的核心。取决于
硬件平台可能是也可能不是主线("官方")版本。
通常由内置或可加载(从外部完成)完成
源 - 免费或不是)模块。初始化整个系统根据硬编码配置工作所需的所有硬件和DT - 启用MMU,编排整个系统并以异常方式访问硬件。根据启动参数
(cmdline - 通常由前一阶段传递)和/或编译
选项,内核尝试挂载根文件系统。来自
rootfs,它会尝试加载一个init(即/ sbin / init - where / is
刚安装的rootfs)。
Init和rootfs - init是第一个要运行的非内核任务, 有PID 1.它会使您需要使用的所有内容 系统。在生产嵌入式系统中,它也是主要的 应用。在这样的系统中是BusyBox或定制的 应用
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使你可以使用。
我将在接下来的几个小时内添加引用,扩展和例外。