做一个嵌入式Linux系统究竟要做哪些工作

构建嵌入式Linux系统需要什么?也就是说,这篇文章是关于什么的?先介绍一个脉络,可以作为我们后续工作的大纲:

第一步,建立交叉编译环境

没有交叉开发的读者经历可能会迷茫一阵子。
很难接受这个概念。
首先我们需要了解两个概念:一般来说,我们工作的机器称为开发机和主机,我们创建的系统会放在特定的机器上,比如手机或者另一台PC,而这台机器称为目标主机。

我们的开发机器上一般已经有一套开发工具,我们称之为原生开发包。
我们通常用它们来编写程序。
那么什么是交叉编译环境。
事实上,它一点也不神秘。
这意味着在开发机器上安装另一套开发工具。
这套开发工具编译出来的程序,比如内核,系统工作,或者我们自己的程序,运行在目标上。
主持人。

那么有新手可能会问,直接使用原生开发工具为目标主机编译程序不就可以了吗?至少我一开始是这么想的。
一般来说,我们的开发机器都是基于X86平台的,原来的开发包开发的工具也是针对该平台的。

一般来说,交叉开发环境需要二进制实用程序、编译器和C链接库。
嵌入式开发中常用的这三类软件是:

Binutils

G

uClibc

当然,GNU包含的不仅仅是工具包,你还要根据实际需要进行选择

第二步编译内核

开发工具有针对特定类型的硬件平台,内核也是如此。
这一步,我们需要使用第一步创建的工具来编译内核,对于有内核编译经验的人来说,这很简单;

第三步,建立根文件系统<。
/p>

也就是创建很多我们平常看到的bin、dev、proc目录,除了一些必要的文件之外,另外还需要为我们的目标系统安装一些常用的实用软件如ls、ifconfig等一种方法当然是找到这些工具的源代码并使用第一步构建我们使用独立的交叉编译工具来编译,但是这些软件数量较多,有的体积较大,不适合嵌入式系统。
我们通常使用busybox来完成这一步,其中包括系统引导软件init>

最后我们系统还需要创建一个初始化引导文件,如inittab

第四步,引导系统system

在这一步中,我们把创建的目标、文件、程序、内核和模块的所有内容复制到目标机器的存储中,例如硬盘。
然后安装系统bootloader对于嵌入式系统来说,有很多bootloader可供我们使用。
然而,其中许多都有硬件平台的限制。
当然,如果你使用的是X86,你可以直接使用lilo来启动。
事实上,本文使用的是lilo。

完成此步骤后,将目标存储设备连接到目标机器。
如果一切顺利,就可以启动系统了。

当然,对于一些特殊平台,是不能像硬盘一样复制的。
需要读卡器和烧录,但基本方法是一样的!

第五步,对系统进行优化和个性化

通过前四步,我们已经得到了一个可以正常运行的系统。
在这一步中,是时候发挥你的想象力了

嵌入式设备的嵌入式设备上的Linux系统开发

Linux在嵌入式开发领域不断发展。
由于Linux使用GPL(请参阅本文后面的参考资料),任何有兴趣为PDA、手持式计算机或可穿戴设备定制Linux的人都可以从Internet免费下载内核和应用程序,并可以开始移植或开发。
许多Linux变体迎合嵌入式/实时市场。
其中包括RTLinux(实时Linux)、uLinux(用于非MMU设备的Linux)、MontevistaLinux(用于ARM、MIPS、PPC的Linux发行版)、ARM-Linux(ARM上的Linux)和其他Linux系统。
开发通常涉及三个级别:引导加载程序、Linux内核和图形用户界面(或GUI)。
引导加载程序通常是在任何硬件上执行的第一段代码。
在台式计算机等传统系统中,引导加载程序通常加载到主引导记录(MBR)中,或者Linux所在磁盘的第一个扇区中。
通常,在台式机或其他系统上,BIOS将控制权移交给引导加载程序。

特殊软件可以直接与远程系统上的闪存设备交互,并将引导加载程序安装在闪存中的给定位置。
闪存设备是一种特殊的芯片,其功能与存储设备类似,并且它们持久地存储信息——也就是说,它们的内容在重启时不会被删除。

某些类型的嵌入式设备具有小型启动代码(基于几个字节的指令),用于初始化某些DRAM设置。
并在目标上启用串行(或USB或以太网)连接。
端口与主机程序进行通信。
主机程序或加载程序可以使用此连接将引导加载程序传输到目标并将其写入闪存。
安装工具链会在主机上创建一个构建环境,以编译将在目标上运行的内核和应用程序-这是因为目标硬件可能不具有与主机兼容的二进制执行级别。

工具链由一组用于编译、组装和链接内核和应用程序的组件组成。
这些组件包括:Binutils–用于操作二进制文件的实用程序集合。
它们包括ar、as、objmp和objcopy等实用程序。
G-GNUC编译器。
Glibc——所有用户应用程序都将链接到的C库。
避免使用任何C库函数的内核和其他应用程序可以在没有此库的情况下进行编译。
构建工具链建立了交叉编译环境。
本机编译器以与本机编译器相同的方式编译处理器的指令。
交叉编译器在一个处理器上运行,但可以编译另一处理器的指令。
从头开始安装交叉编译器工具链并不是一项小任务:它涉及下载源代码、修补、配置、编译、设置头文件、安装等等。
另外,这样的整个制造过程对内存和硬盘的要求非常高。
如果您没有足够的内存和硬盘空间如果是这样,由于依赖项、配置或头文件设置,在构建阶段可能会出现许多问题。

所以能够从互联网上获取预编译的二进制文件是一件好事(但不好的事情是它们大多数仅限于基于ARM的系统,但这很快就会改变)。
一些更流行的预编译工具链包括Compaq(FamiliarLinux)、Lart(LartLinux)和Embedion(基于Debian但与其无关)——全部适用于基于ARM的平台。
从用户的角度来看,图形用户界面(GUI)是系统最重要的方面之一:用户通过GUI与系统进行交互。
因此GUI应该易于使用并且非常可靠。
但它还需要具有内存感知能力,以便能够在内存受限的小型嵌入式设备上无缝执行。
因此,它应该重量轻且加载速度快。

另一个需要考虑的重要方面涉及许可问题。
某些GUI发行版具有允许免费使用的许可证,即使在某些商业产品中也是如此。
如果您想在项目中包含GUI,其他许可证则要求您支付版税。

最后,大多数开发人员可能会选择XFree86,因为XFree86为他们提供了一个熟悉的环境来使用他们喜欢的工具。
然而,随着市场上新的GUI,例如CenturySoftware(Nano-X)和TrolltechQt/Embedded,嵌入式Linux在该领域与X展开竞争。
竞争激烈,主要是因为它们占用资源少、执​​行速度快并且支持自定义小部件。

linux学习路线参考(嵌入式篇)

嵌入式Linux学习路线:1、Linux简介主要的嵌入式开发环境是Linux,由于其开源性和易用性而广受欢迎。
Linux系统有很多,例如RedHat、Ubuntu和Fedora。
对于嵌入式系统开发人员来说,掌握Linux服务和设计理念非常重要。
Ubuntu官方网站提供了下载地址。
2、C语言C语言是嵌入式系统开发的基础。
在Linux上使用C更容易,因为它起源于Unix。
学习C语言时,掌握指针至关重要。
你需要能够使用指针、多级指针、函数指针等。
内存分配也是一个重要的部分。
学习C、编写更多代码并提高您的技能。
3.数据结构与算法。
数据结构决定了代码的质量。
探索链表和树等结构。
学习内核功能的实现,了解Linux内核,为开发顶层应用打下坚实的基础。
4.设计Linux应用程序。
了解进程、线程和信号等关键概念。
了解socket编程,掌握TCP/IP协议。
练习开发诸如shell命令解析器、聊天软件、视频组播等应用程序。
5.ARM架构ARM处理器拥有较大的市场份额,适合嵌入式系统开发。
学习ARM指令集并了解汇编语言。
使用开发板,下载处理器对应的资料,编写代码并实现功能。
6.Linux内核和驱动程序。
掌握内核驱动程序开发对于职业发展至关重要。
通过下载内核源码包并阅读代码来测试您的基本技能。
为硬件编写驱动程序,定制内核,制作文件系统并将其传输到开发板。
附录:C++Linux后端开发资源包括Linux、Nginx、MySQL、Redis、P2P、K8S、Docker、TCP/IP、协程、DPDK、webrtc等视频资源。
有兴趣的朋友可以私信领取教材。