2024年10月linux移植(「干货」嵌入式Linux系统移植的四大步骤(上))

 更新时间:2024-10-12

  ⑴linux移植(「干货」嵌入式Linux系统移植的四大步骤(上

  ⑵交叉开发环境必然会用到交叉编译工具,我们的交叉工具链顾名思义就是在PC机上编译出能够在我们目标开发平台比如ARM上运行的程序,不就是一个交叉编译工具吗,这里所说的交叉开发环境主要指的是:在开发主机上(通常是我的pc机)开发出能够在目标机(通常是我们的开发板)上运行的程序,在整个过程中并不需要把文件系统烧录到Flash中去,交叉工具链的制作方法和系统移植有着很多相似的地方,交叉开发工具是一个支持很多平台的工具集的集合(类似于Linux源码),这里说的交叉编译工具是一个由编译器、连接器和解释器组成的综合开发环境。

  ⑶「干货」嵌入式Linux系统移植的四大步骤(上

  ⑷在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命令就可以完成非常复杂的功能,可是我们有没有想过,为什么会有这样的效果?

  ⑸如果没有去追问,只是机械地完成,并且看到实验效果,这样做其实并没有真正的掌握系统移植的本质。

  ⑹在做每一个步骤的时候,首先问问自己,为什么要这样做,然后再问问自己正在做什么?搞明白这几个问题,我觉得就差不多了,以后不管更换什么平台,什么芯片,什么开发环境,你都不会迷糊,很快就会上手。对于嵌入式的学习方法,我个人方法就是:从宏观上把握(解决为什么的问题),微观上研究(解决正在做什么的问题),下面以自己学习的arm-cortex_a开发板为目标,介绍下自己的学习方法和经验。

  ⑺嵌入式Linux系统移植主要由四大部分组成:

  ⑻搭建交叉开发环境二、bootloader的选择和移植三、kernel的配置、编译、和移植四、根文件系统的制作

  ⑼第一部分:搭建交叉开发环境

  ⑽先介绍第一分部的内容:搭建交叉开发环境,首先必须得思考两个问题,什么是交叉环境?为什么需要搭建交叉环境?

  ⑾先回答第一个问题,在嵌入式开发中,交叉开发是很重要的一个概念,开发的第一个环节就是搭建环境,第一步不能完成,后面的步骤从无谈起,这里所说的交叉开发环境主要指的是:在开发主机上(通常是我的pc机)开发出能够在目标机(通常是我们的开发板)上运行的程序。嵌入式比较特殊的是不能在目标机上开发程序(狭义上来说),因为对于一个原始的开发板,在没有任何程序的情况下它根本都跑不起来,为了让它能够跑起来,我们还必须要借助pc机进行烧录程序等相关工作,开发板才能跑起来,这里的pc机就是我们说的开发主机,想想如果没有开发主机,我们的目标机基本上就是无法开发,这也就是电子行业的一句名言:搞电子,说白了,就是玩电脑!

  ⑿然后回答第二个问题,为什么需要交叉开发环境?主要原因有以下几点:

  ⒀原因:嵌入式系统的硬件资源有很多限制,比如cpu主频相对较低,内存容量较小等,想想让几百MHZ主频的MCU去编译一个Linuxkernel会让我们等的不耐烦,相对来说,pc机的速度更快,硬件资源更加丰富,因此利用pc机进行开发会提高开发效率。

  ⒁原因:嵌入式系统MCU体系结构和指令集不同,因此需要安装交叉编译工具进行编译,这样编译的目标程序才能够在相应的平台上比如:ARM、MIPS、POWEPC上正常运行。

  ⒂交叉开发环境的硬件组成主要由以下几大部分:

  ⒃开发主机.目标机(开发板.二者的链接介质,常用的主要有种方式:()串口线()USB线()网线

  ⒄对应的硬件介质,还必须要有相应的软件“介质”支持:

  ⒅对于串口,通常用的有串口调试助手,putty工具等,工具很多,功能都差不多,会用一两款就可以;

  ⒆对于USB线,当然必须要有USB的驱动才可以,一般芯片公司会提供,比如对于三星的芯片,USB下载主要由DNW软件来完成;

  ⒇对于网线,则必须要有网络协议支持才可以,常用的服务主要两个

  ⒈第一:tftp服务:

  ⒉主要用于实现文件的下载,比如开发调试的过程中,主要用tftp把要测试的bootloader、kernel和文件系统直接下载到内存中运行,而不需要预先烧录到Flash芯片中,一方面,在测试的过程中,往往需要频繁的下载,如果每次把这些要测试的文件都烧录到Flash中然后再运行也可以,但是缺点是:过程比较麻烦,而且Flash的擦写次数是有限的;另外一方面:测试的目的就是把这些目标文件加载到内存中直接运行就可以了,而tftp就刚好能够实现这样的功能,因此,更没有必要把这些文件都烧录到Flash中去。

  ⒊主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。

  ⒋另外,还有一个名字叫samba的服务也比较重要,主要用于文件的共享,这里说的共享和nfs的文件共享不是同一个概念,nfs的共享是实现网络文件的共享,而samba实现的是开发主机上Windows主机和Linux虚拟机之间的文件共享,是一种跨平台的文件共享,方便的实现文件的传输。

  ⒌以上这几种开发的工具在嵌入式开发中是必备的工具,对于嵌入式开发的效率提高做出了伟大的贡献,因此,要对这几个工具熟练使用,这样你的开发效率会提高很多。等测试完成以后,就会把相应的目标文件烧录到Flash中去,也就是等发布产品的时候才做的事情,因此对于开发人员来说,所有的工作永远是测试。

  ⒍通过前面的工作,我们已经准备好了交叉开发环境的硬件部分和一部分软件,最后还缺少交叉编译器,读者可能会有疑问,为什么要用交叉编译器?前面已经讲过,交叉开发环境必然会用到交叉编译工具,通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,开发主机PC平台(XCPU上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在XCPU平台上是不能运行的,必须放到ARMCPU平台上才能运行,虽然两个平台用的都是Linux系统。相对于交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种跨平台程序的编译器就叫交叉编译器,相对来说,用来做本地编译的工具就叫本地编译器。所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。

  ⒎这里又有一个问题,不就是一个交叉编译工具吗?为什么又叫交叉工具链呢?原因很简单,程序不能光编译一下就可以运行,还得进行汇编和链接等过程,同时还需要进行调试,对于一个很大工程,还需要进行工程管理等等,所以,这里说的交叉编译工具是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils(主要包括汇编程序as和链接程序ld)、g(为GNU系统提供C编译器)和glibc(一些基本的C函数和其他函数的定义)个部分组成。有时为了减小libc库的大小,也可以用别的c库来代替glibc,例如uClibc、dietlibc和newlib。

  ⒏那么,如何得到一个交叉工具链呢?是从网上下载一个“程序”然后安装就可以使用了吗?回答这个问题之前先思考这样一个问题,我们的交叉工具链顾名思义就是在PC机上编译出能够在我们目标开发平台比如ARM上运行的程序,这里就又有一个问题了,我们的ARM处理器型号非常多,难道有专门针对我们某一款的交叉工具链吗?若果有的话,可以想一想,这么多处理器平台,每个平台专门定制一个交叉工具链放在网络上,然后供大家去下载,想想可能需要找很久才能找到适合你的编译器,显然这种做法不太合理,且浪费资源!因此,要得到一个交叉工具链,就像我们移植一个Linux内核一样,我们只关心我们需要的东西,编译我们需要的东西在我们的平台上运行,不需要的东西我们不选择不编译,所以,交叉工具链的制作方法和系统移植有着很多相似的地方,也就是说,交叉开发工具是一个支持很多平台的工具集的集合(类似于Linux源码),然后我们只需从这些工具集中找出跟我们平台相关的工具就行了,那么如何才能找到跟我们的平台相关的工具,这就是涉及到一个如何制作交叉工具链的问题了。

  ⒐通常构建交叉工具链有如下三种方法:

  ⒑方法一:分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工具链。

  ⒒方法二:通过Crosstool-ng脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。

  ⒓方法三:直接通过网上下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的,没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名其妙的错误,建议读者慎用此方法。

  ⒔crosstool-ng是一个脚本工具,可以制作出适合不同平台的交叉编译工具链,在进行制作之前要安装一下软件:$sudoapt-getinstallg++libncurses-devbisonflextexinfoautomakelibtoolpatchgcjcvscvsdga().编译().针对我们的平台进行相应的移植,主要包括修改SDRAM的运行地址,从x().“开关”相应的宏定义().添加Nand和网卡的驱动代码().优化go命令().重新编译makedistclean(彻底删除中间文件和配置文件)makespc_config(配置我们的开发板)make(编译出我们的u-boot.bin镜像文件)().设置环境变量,即启动参数,把编译好的u-boot下载到内存中运行,过程如下:.配置开发板网络ip地址配置:$setenvipaddr...配置ip地址到内存的环境变量$saveenv保存环境变量的值到nandflash的参数区网络测试:在开发开发板上ping虚拟机:$ping...(虚拟机的ip地址)如果网络测试失败,从下面几个方面检查网络:.网线连接好.开发板和虚拟机的ip地址是否配置在同一个网段.虚拟机网络一定要采用桥接(VM--Setting--》option).连接开发板时,虚拟机需要设置成静态ip地址.在开发板上,配置tftp服务器(虚拟机)的ip地址$setenvserverip...(虚拟机的ip地址)$saveenv.拷贝u-boot.bin到/tftpboot(虚拟机上的目录).通过tftp下载u-boot.bin到开发板内存$tftp(内存地址即可)u-boot.bin(要下载的文件名)如果上面的命令无法正常下载:.serverip配置是否正确.tftp服务启动失败,重启tftp服务#sudoservicetftpd-hparestart.烧写u-boot.bin到nandflash的地址$nanderase(起始地址)(大小)擦出nandflash-k的区域$nandwrite((缓存u-boot.bin的内存地址)(nandflash上u-boot的位置)(烧写大小).切换开发板的启动方式到nandflash.关闭开发板.把SW的开关拨到的那边.启动开发板,它就从nandflash启动

  ⒕如何将linux下的程序,移植到freertos中

  ⒖什么叫linux系统移植

  ⒗一般来讲Linux系统移植是把Linux从一个已经支持的硬件架构上移植到一个还未支持的硬件架构上。由于Linux最初是LinusTrovalds为x架构写的,因此一般Linux系统移植是把x版本移植到别的架构上,例如arm、mips、powerPC、SPARC(近几年主流Linux发行版都倾向于只支持x、amd和arm版,对其他平台的支持越来越少了。

您可能感兴趣的文章:

相关文章