最近,在学习系统移植的相关知识程中,发现了很多问题,也解决了很多问题,但总是对我们的发展结果有一种莫名其妙的感觉,纠正原因,主要是对我们的发展环境没有深刻的了解,有时几个简单的命令可以完成非常复杂的功能,但是我们有没有想过为什么会有这样的效果?如果不提问,只是机械完成,看到实验效果,并没有真正掌握系统移植的本质。如果不提问,只是机械完成,看到实验效果,并没有真正掌握系统移植的本质。
每一步,先问问自己,为什么要这样做,再问问自己在做什么。了解这些问题,我觉得差不多。以后不管换什么平台,什么芯片,什么开发环境,都不会迷茫,很快就会上手。对于嵌入式学习方法,我个人的方法是:从宏观上把握(解决为什么的问题),从微观上研究(解决我在做什么的问题),以下是我自己学到的。arm-cortex_a以开发板为目标,介绍自己的学习方法和经验。
嵌入式Linux主要是系统移植由四部分组成:
一.建立交叉开发环境
二、bootloader选择和移植
三、kernel配置、编译和移植
四、制作根文件系统
第一部分:构建交叉开发环境
首先介绍的内容:构建交叉开发环境,首先要考虑两个问题,什么是交叉环境? 为什么要建立交叉环境?
首先回答第一个问题,在嵌入式开发中,交叉开发是一个非常重要的概念,开发的第一个环节是建立环境,第一步不能完成,以下步骤从未开始,交叉开发环境主要指:在开发主机(通常是我的pc在目标机(通常是我们的开发板)上开发程序。嵌入式更特殊的是不能在目标机器上开发程序(狭义),因为对于原始开发板,它不能在没有任何程序的情况下运行,为了让它运行,我们也必须使用它pc机器进行烧录程序等相关工作,开发板可以在这里运行pc机器就是我们所说的开发主机,想想如果没有开发主机,我们的目标机器基本上是无法开发的,这是电子行业的一句名言:搞电子,说白了,就是玩电脑!
然后回答第二个问题,为什么需要交叉开发环境?主要原因如下:
原因1:嵌入式系统的硬件资源有很多限制,比如cpu主频相对较低,内存容量较小,想要数百MHZ主频的MCU去编译一个Linux kernel会让我们等待不耐烦,相对而言,pc机器速度更快,硬件资源更丰富,因此利用pc开发机器将提高开发效率。
原因2:嵌入式系统MCU不同的系统结构和指令集,因此需要安装交叉编译工具进行编译,以便在相应的平台上编译目标程序:ARM、MIPS、 POWEPC正常运行。
交叉开发环境的硬件组成主要由以下大部分组成:
1.开发主机
2.目标机(开发板)
三、二者的链接介质,常用的方法有三种:(1)串口线 (2)USB线 (3)网线
对应的硬件介质,还必须有相应的软件介质支持:
1.对于串口,通常使用串口调试助手,putty工具等,工具多,功能相似,可以用一两个;
2.对于USB当然,必须有线USB一般芯片公司都会提供,比如三星芯片,USB下载主要由DNW软件完成;
3.对于网线,必须有网络协议主要有两种常用服务
第一:tftp服务:
主要用于下载文件,如开发和调试tftp把要测试的bootloader、kernel直接将文件系统下载到内存中,无需提前烧录Flash芯片中,一方面,在测试过程中,经常需要频繁下载,如果每次都烧录这些要测试的文件Flash然后运行也可以,但缺点是过程麻烦,Flash擦写次数有限;另一方面,测试的目的是将这些目标文件加载到内存中并直接运行,tftp所以,没有必要烧录所有这些文件Flash中去
第二:nfs服务:
主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发过程中,通常在系统移植的最后一步,然后我们可以在开发主机上放置制作的文件系统PC开发板通过相应的位置nfs为了测试我们制作的文件系统是否正确,不需要在整个过程中烧录文件系统Flash而且挂载是自动挂载的,bootload启动后,kernel因此,运行后会根据我们设置的启动参数自动挂载,这种方法对开发测试非常方便,可以提高开发效率。
另外,还有一个名字叫samba服务也很重要,主要用于文件共享,这里说的是共享和nfs文件共享不是同一个概念,nfs共享是实现网络文件的共享,samba在开发主机上实现Windows主机和Linux虚拟机之间的文件共享,跨平台文件共享是一种,文件传输方便。
上述开发工具是嵌入式开发的必要工具,为提高嵌入式开发的效率做出了巨大贡献。因此,熟练使用这些工具将大大提高您的开发效率。测试完成后,将烧录相应的目标文件Flash在中间,也就是说,当产品发布时,所以对于开发人员来说,所有的工作总是一个测试。
通过之前的工作,我们准备了交叉开发环境的硬件部分和部分软件,最终缺乏交叉编译器。读者可能会想,为什么要使用交叉编译器?正如我前面所说,交叉编译工具将不可避免地用于交叉开发环境。一般来说,它是在一个平台上编译另一个可以在不同系统结构上运行的程序,并开发主机PC平台(X86 CPU)在以上编译可以运行ARM为内核的CPU在平台上编译的程序X86 CPU平台不能运行,必须放在平台上ARM CPU只能在平台上运行,虽然两个平台都在使用Linux系统。与交叉编译相比,通常的编译称为本地编译,即在当前平台上编译,编译程序也在本地执行。与交叉编译相比,通常的编译被称为本地编译,即在当前的平台上,编译程序也在本地执行。用于编译这个跨平台程序的编译器被称为交叉编译器。相对而言,用于本地编译的工具被称为本地编译器。因此,必须使用交叉编译工具链来生成在目标机上运行的程序。
还有一个问题,不就是交叉编译工具吗?为什么也叫交叉工具链?原因很简单。程序不能仅仅通过编译来运行。它还需要汇编和链接。同时,它还需要调试。对于一个大型项目,它还需要项目管理等。因此,在这里 交叉编译工具是由编译器、连接器和解释器综合开发环境,交叉编译工具链主要由交叉编译工具链组成binutils(主要包括汇编程序as和链接程序ld)、gcc(为GNU系统提供C编译器glibc(定义一些基本的C函数和其他函数) 三部分组成。有时是为了减少libc也可以使用其他库的大小 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。有时是为了减少libc也可以使用其他库的大小 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。
那么,如何获得交叉工具链呢?可以从网上下载一个程序然后安装吗?在回答这个问题之前,我们首先考虑这样一个问题。顾名思义,我们的交叉工具链是PC在我们的目标开发平台上,如ARM在操作程序上,这里还有另一个问题,我们的ARM有很多型号的处理器。有专门针对我们交叉工具链吗?如果是这样,你可以考虑一下。在这么多的处理器平台上,每个平台都定制了一个交叉工具链,并将其放在网络上供您下载。想想看,找到一个适合你的编译器可能需要很长时间。显然,这种做法不合理,浪费资源!因此,得到交叉工具链就像移植一样Linux核心,我们只关心我们需要什么,编译我们需要在我们的平台上运行,不需要我们不选择不编译,所以,交叉工具链生产方法和系统移植有很多相似之处,也就是说,交叉开发工具是支持许多平台的工具集(类似于Linux源码),然后我们只需要从这些工具中找到与我们平台相关的工具,那么如何找到与我们平台相关的工具,这涉及到如何制作交叉工具链。
通常有三种方法可以构建交叉工具链:
方法一 :交叉编译工具链所需的库和源代码分步编译和安装,最终生成交叉编译工具链。
通常有三种方法可以构建交叉工具链:
方法一 :交叉编译工具链所需的库和源代码分步编译和安装,最终生成交叉编译工具链。该方法相对困难,适合想要深入学习构建交叉工具链的读者。如果只想使用交叉工具链,建议使用以下方法2构建交叉工具链。
方法二:
方法三 :
crosstool-ng可制作适合不同平台的交叉编译工具链的脚本工具,制作前安装软件:$ sudo apt-get install g libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
1. 安装源码包路径和交叉编译器
2. 修改交叉编译器的框架
3. 为了提高运行效率,加快编译,增加编译过程中的并行进程数,因为编译速度会比较慢。4. 关闭JAVA编译器 ,减少编译时间5. 编译
6. 增加环境变量
4. 关闭JAVA编译器 ,减少编译时间
5. 编译6. 增加环境变量7. 刷新环境变量。
8. 测试交叉工具链到此,嵌入式Linux系统移植的第一部分是完成的,然后可以进行后续开发。
第二部分:bootloader选择和移植
是操作系统内核运行前运行的小程序。通过这个小程序,我们可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到适当的状态,为最终调用操作系统的核心准备正确的环境,这就是所谓的引导加载程序(Boot Loader)。
【图1】Flash存储存储文件的分布图
二、为什么系统移植前要移植?BootLoader?
BootLoader任务是指导操作系统。所谓指导操作系统,就是启动内核,让内核操作就是将内核加载到内存中RAM中 去运