Linux内核移植

Linux内核有三个主要工作:管理资源,通过插口接合硬件,并为用户控件程序提供一个具象化的插口。具体来说主要负责的进程管理、内存管理、文件系统、网络通讯、硬件驱动等功能。相对应的,各主要部份功能如下:

进程管理:内核负责创建和销毁进程,并处理进程与输入和输出设备的不同进程间的数据处理,调度器,控制进程怎么共享CPU,是进程管理的一部份.更一般地,内核的进程管理活动实现了多个进程在一个单个或则几个CPU之上的具象.

显存管理:计算机的显存是主要的资源,处理它所用的策略对系统性能是至关重要的.内核为所有进程的每一个都在有限的可用资源上构建了一个虚拟地址空间.内核的不同部份与显存管理子系统通过一套函数调用交互,从简单的malloc/free对到更多更复杂的功能.

文件系统:Unix在很大程度上基于文件系统的概念;几乎Unix中的任何东西都可看作一个文件.内核在非结构化的硬件之上构建了一个结构化的文件系统,结果是文件的具象特别多地在整个系统中应用.另外,Linux支持多个文件系统类型,就是说,化学介质上不同的数据组织形式.诸如,c盘可被格式化成标准Linux的ext3文件系统,普遍使用的FAT文件系统,或则其他几个文件系统.

网路通讯:网路必须由操作系统来管理,由于大部份网路操作不是特定于某一个进程:步入系统的报文是异步风波.报文在某一个进程接手之前必须被搜集,辨识,分发.系统负责在程序和网路插口之间递送数据报文,它必须依照程序的网路活动来控制程序的执行.另外,所有的路由和地址解析问题都在内核中实现.

硬件驱动:几乎每位系统操作最终都映射到一个化学设备上.不仅处理器,显存和特别少的别的实体之外,全部中的任何设备控制操作都由特定于要轮询的设备相关的代码来进行.这种代码称为设备驱动.内核中必须嵌入系统中出现的每位外设的驱动,从硬碟驱动到鼠标和磁带驱动器.

对于嵌入式Linux内核的移植,更多的是将自己定义的硬件平台添加至嵌入式Linux内核中,同时会涉及到更改一定的驱动插口的更改,促使嵌入式Linux内核才能正常的运行在相应的硬件平台。

Linux内核源码下载

和U-Boot一样,Linux官方也提供了不同版本的Linux内核。相应的,NXP也会从Linux官方下载一个稳定版本的Linux内核,并将其移植到NXP的CPU上linux内核移植,之后再将移植之后的Linux内核版本开放给NXPCPU的用户。用户从NXP下载对应CPU的Linux内核,之后将其移植到自己的产品上。对于i.mx6ull,教程中采用的是NXP官方维护的Linux版本imx_5.4.47_2.2.0,所以,我们将在imx_5.4.47_2.2.0版本上进行更改。其下载地址为。具体下载方式如下:

使用gitclone获取Linux内核源码,如下:

linux内核移植实验报告_linux内核移植_linux内核移植的一般步骤

PS:对于教程中使用到的Linux内核源码,笔者早已将其在云盘中进行分享:

降低Linux-KernelRecipe

在Linux内核移植过程中,须要更改相应的Linux内核源码,同样的,我们不会直接在Yocto中提供的recipe中直接更改,而是在我们之前创建的metadata中创建新的recipe的方法来对Linux内核编译过程进行配置。Linux内核的配置属于distro中的内容。在/sources/meta-bird-imx6ull/conf/distro路径下的bird-imx-fb.conf中,通过includeconf/distro/include/bird-imx-preferred-env.inc的方法,引用了bird-imx-preferred-env.inc文件,在该文件中,通过PREFERRED_PROVIDER_virtual/kernel_imx变量定义了Linux内核的provider,如下所示:

可以看出,imx6ullLinux内核的provider是linux-imx,实际上,其对应的是/sources/meta-imx/meta-bsp/recipes-kernel/linux/路径下的linux-imx_5.4.bb文件。为此,降低相应的Linux内核recipe,步骤如下:

创建如下路径:/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-kernel/linux,并将/sources/meta-imx/meta-bsp/recipes-kernel/linux路径下的linux-imx_5.4.bb拷贝至/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-kernel/linux路径下,并将linux文件夹下的linux-imx_5.4.bb重命名为:linux-bird_5.4.bb。同时,将/sources/meta-bird-imx6ull/conf/distro/include/路径下的bird-imx-preferred-env.inc中的PREFERRED_PROVIDER_virtual/kernel_imx="linux-imx"更改为PREFERRED_PROVIDER_virtual/kernel_imx="linux-bird"。更改后的bird-imx-preferred-env.inc如下:

linux内核移植的一般步骤_linux内核移植实验报告_linux内核移植

2.降低默认配置文件:Linux内核功能是可以通过linux内核源码路径下的配置文件.config进行剪裁的,对于imx6ullCPU来说,.config文件可以由默认的配置文件defconfig生成。将Linux内核源码/arch/arm/configs路径下的imx_v7_defconfig文件复制到/sources/meta-bird-imx6ull/recipes-kernel/linux/files路径下,并将其重命名为defconfig,但是在linux-bird_5.4.bb文件中降低表里SRC_URI值,如下:

须要注意的是,linux内核功能的配置可以由多种更改配置路径共同决定的,最终生成.config文件。通常来说,在开始编译Linux内核时,会采用一个默认的配置信息,使Linux内核具有明晰的初始状态,再在其他途径(方式)对linux内核进行配置。一般来说,默认配置文件的确定是须要多次反复迭代确定的,详尽的更改方式,在前面更改默认配置文件章节会有介绍。

更改完成后,使用bitbake-ccompile-flinux-bird编译Linux内核,编译过程如下:

linux内核移植实验报告_linux内核移植的一般步骤_linux内核移植

可以看见,新降低的linux内核recipe参与了最终Linux内核的编译过程。但目前,在linux-bird_5.4.bb中内容和官方提供的linux-imx_5.4.bb完全一致,因而,编译下来的Linux内核也是和官方提供了一致的。接出来,就是须要通过更改linux-bird_5.4.bb文件,将编译Linux内核使用的源码指向我们下载保存在本地的Linux内核源码,采用本地的Linux内核源码建立Linux内核linux文本编辑器,因而实现linux内核移植puppy linux,通过更改本地Linux内核源码配置Linux内核的目的。

更改Linux-kernelRecipe

对于Linuxkerne的移植,更多的是须要通过更改Linux内核的配置信息等,使其才能正常工作于我们自己设计的硬件平台上。同样的,在更改Linux内核源码前,我们须要将从NXP官网下载的Linux内核源码置于本地,而且将OpenEmbedded编译所使用的Linux内核源码指向我们本地储存的Linux内核源码路径,这样,就可以实现只修改本地储存的Linux内核源码,而不至于影响到其他项目。教程中,将从NXP官网下载的imx_5.4.47_2.2.0.tar.bz2拷贝至/Linux/fsl-release-yocto路劲下,采用如下命令解压:

解压后,将其重命名为:linux-imx-bird,如右图所示:

linux内核移植实验报告_linux内核移植_linux内核移植的一般步骤

将Linux内核源码储存在/Linux/fsl-release-yocto/linux-imx-bird路径,但是采用Git管理以后,更改/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-kernel/linux/linux-bird_5.4.bb文件,将其中的SRC_URI指向本地储存Linux内核源码的路径。如右图所示:

linux内核移植的一般步骤_linux内核移植_linux内核移植实验报告

文档配套教学视频B站搜索“嵌入式孙工”

本文原创地址://gulass.cn/lnhyznhdbfgn.html编辑:刘遄,审核员:暂无