第十八章Linux内核移植

前两章我们简单了解了一下Linux内核顶层Makefile和Linux内核的启动流程,本章我们就来学习一下如何将Xilinx官方提供的Linux内核移植到正点原子的领航者开发板上。需要说明的是当我们使用Petalinux工具的时候是不需要移植内核的,因为Petalinux工具可以根据硬件描述文件hdf使能相应配置。本章讲解内核移植(更准确的说是内核适配)是为了了解一般情况下(不使用Petalinux)的内核移植过程。通过本章的学习,我们将掌握如何将半导体厂商提供的Linux BSP包移植到我们自己的平台上。
18.1Xilinx官方开发板Linux内核编译
本章的移植我们使用Xilinx提供的Linux源码,将其移植到正点原子领航者开发板上。Xilinx提供的Linux源码已经放到了开发板光盘中,路径为:ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70203_Embedded_Linux资源文件kernellinux-xlnx-xilinx-v2018.3.tar.gz。将其发送到Ubuntu中并解压到名为linux-xlnx-xilinx的目录(没有该目录可创建,位置任意)下。
Xilinx提供的Linux源码肯定可以在Xilinx的ZYNQ EVK开发板上运行的,我们以ZYNQ EVK开发板为参考,然后将Linux内核移植到我们的领航者开发板上。
18.1.1修改顶层Makefile
修改顶层Makefile,直接在顶层Makefile文件里面定义ARCH和CROSS_COMPILE这两个的变量值为arm和arm-linux-gnueabihf-,结果如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_开发板


图 29.1.1修改顶层Makefile

先注释掉原先的设置,方便后面我们复原,然后分别设置ARCH和CROSS_COMPILE这两个变量的值,这样在编译的时候就不用输入很长的命令了。
18.1.2配置并编译Linux内核
和uboot一样,在编译Linux内核之前要先配置Linux内核。每个板子都有其对应的默认配置文件,这些默认配置文件保存在arch/arm/configs目录中。xilinx_zynq_defconfig作为ZYNQ EVK开发板所使用的默认配置文件。
进入到Ubuntu中的Linux源码根目录下,执行如下命令配置Linux内核:

  1. make clean //第一次编译Linux内核之前先清理一下
  2. make xilinx_zynq_defconfig //配置Linux内核

复制代码

配置完成以后如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_设备树_02


图 29.1.2配置Linux内核

配置完成以后就可以编译了,使用如下命令编译Linux内核:

  1. make -j16 //编译Linux内核

复制代码

等待编译完成,结果如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux_03


图 29.1.3 Linux编译完成

Linux内核编译完成以后会在arch/arm/boot目录下生成zImage镜像文件,如果使用设备树的话还会在arch/arm/boot/dts目录下开发板对应的.dtb(设备树)文件,比如zynq-zc702.dtb就是Xilinx官方的ZYNQ ZC702 EVK开发板对应的设备树文件。至此我们得到两个文件:
①Linux内核镜像文件:zImage。
②Xilinx官方ZYNQ ZC702 EVK开发板对应的设备树文件:zynq-zc702.dtb。
18.1.3Linux内核启动测试
在上一小节我们已经得到了Xilinx官方ZYNQ ZC702 EVK开发板对应的zImage和zynq-zc702.dtb这两个文件。这两个文件能不能在正点原子的领航者开发板上启动呢?我们得测试一下,在测试之前需要先设置uboot中的环境变量bootargs,设置命令如下:

  1. setenv bootargs ‘console= ttyPS0, 115200’

复制代码

将上一小节编译出来的zImage和zynq-zc702.dtb复制到Ubuntu中的/tftpboot目录下,因为我们要在uboot中使用tftpboot命令将其下载到开发板中,拷贝命令如下:

  1. cp arch/arm/boot/zImage /tftpboot/ -f
  2. cp arch/arm/boot/dts/zynq-zc702.dtb /tftpboot/ -f

复制代码

拷贝完成以后就可以测试了,启动开发板,进入uboot命令行模式,然后输入如下命令将zImage和zynq-zc702.dtb下载到开发板中并启动:

  1. tftpboot 8000 zImage
  2. tftpboot 103cdda8 zynq-zc702.dtb
  3. bootz 8000 - 103cdda8

复制代码

结果下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux_04


图 29.1.4启动Linux内核

从上图可以看出,此时Linux内核启动停止输出信息了,这是因为Xilinx官方ZYNQ ZC702 EVK开发板使用的输出串口是UART1,而我们领航者使用的是UART0。
18.2在Linux中添加自己的开发板
在上一节中我们通过编译Xilinx官方ZYNQ EVK开发板对应的Linux内核,发现其不可以在正点原子的ZYNQ开发板上启动,所以本节我们就参考Xilinx EVK开发板的设置,修改相应的配置使其在正点原子的领航者开发板上能启动。
18.2.1添加开发板默认配置文件
将arch/arm/configs目录下的xilinx_zynq_defconfig重新复制一份,命名为alientek_zynq_defconfig,命令如下:

  1. cd arch/arm/configs
  2. cp xilinx_zynq_defconfig alientek_zynq_defconfig

复制代码

以后alientek_zynq_defconfig就是正点原子的领航者开发板默认配置文件了,可以使用如下命令来配置正点原子领航者开发板对应的Linux内核:

  1. make alientek_zynq_defconfig

复制代码

18.2.2添加开发板对应的设备树文件
Linux支持设备树,每个开发板都有一个对应的设备树文件。Xilinx的ZYNQ系列芯片的所有设备树文件夹都存放在arch/arm/boot/dts目录下,在这个目录下有个名为zynq-zc702.dts的文件,该文件是ZC702开发板的设备树文件。这里我们就不参照zynq-zc702.dts文件,而是参照zynq-zed.dts文件,这是因为zynq-zed.dts是在zynq-zc702.dts文件基础上修改而来,能极大的方便我们的移植。我们将zynq-zed.dts重命名为zynq-alientek.dts,命令如下:

  1. cd arch/arm/boot/dts
  2. cp zynq-zed.dts zynq-alientek.dts

复制代码

.dts是设备树源码文件,编译Linux的时候会将其编译为.dtb文件。
拷贝完成以后修改zynq-alientek.dts文件的内容。首先将文件中的“uart1”全部替换为“uart0”,然后修改部分内容如下所示:

  1. 9 / {
  2. 10 model = "Zynq Alientek Development Board";
  3. 11 compatible = "xlnx,zynq-alientek", "xlnx,zynq-7000";
  4. 12
  5. 13 aliases {
  6. 14 ethernet0 = &gem0;
  7. 15 serial0 = &uart0;
  8. 16 spi0 = &qspi;
  9. 17 mmc0 = &sdhci0;
  10. 18 };
  11. 19
  12. 20 memory@0 {
  13. 21 device_type = "memory";
  14. 22 reg = <0x0 0x40000000>;
  15. 23 };
  16. 24
  17. 25 chosen {
  18. 26 bootargs = "";
  19. 27 stdout-path = "serial0:115200n8";
  20. 28 };
  21. 29
  22. 30 usb_phy0: phy0@e0002000 {
  23. 31 compatible = "ulpi-phy";
  24. 32 #phy-cells = <0>;
  25. 33 reg = <0xe0002000 0x1000>;
  26. 34 usb-reset = ;
  27. 35 view-port = <0x0170>;
  28. 36 drv-vbus;
  29. 37 };
  30. 38 };
  31. 39
  32. 40 &clkc {
  33. 41 ps-clk-frequency = <33333333>;
  34. 42 };
  35. 43
  36. 44 &gpio0 {
  37. 45 emio-gpio-width = <7>;
  38. 46 gpio-mask-high = <0x0>;
  39. 47 gpio-mask-low = <0x5600>;
  40. 48 };
  41. 49
  42. 50 &gem0 {
  43. 51 status = "okay";
  44. 52 phy-mode = "rgmii-id";
  45. 53 phy-handle = ;
  46. 54 local-mac-address = [00 0a 35 00 1e 53];
  47. 55
  48. 56 ethernet_phy: ethernet-phy@0 {
  49. 57 reg = <0>;
  50. 58 device_type = "ethernet-phy";
  51. 59 };
  52. 60 };

复制代码

需要注意的是这里的zynq-alientek.dts文件只是配置了ZYNQ的PS端,使linux内核能够启动,PL端并没有配置,如何配置PL端可以进入第二十章的Petalinux工程,在工程的“componentsplnx_workspacedevice-treedevice-tree”目录下有很多dts文件,可以参考该目录下的system-top.dts文件(特别是该文件所include的文件)来配置zynq-alientek.dts文件。
zynq-alientek.dts修改好以后我们还需要修改文件arch/arm/boot/dts/Makefile,找到“dtb-$(CONFIG_ARCH_ZYNQ)”配置项,在此配置项中加入“zynq-alientek.dtb ” ,如下所示:

  1. 1003 dtb-$(CONFIG_ARCH_ZYNQ) +=
  2. 1004 zynq-cc108.dtb
  3. 1005 zynq-microzed.dtb
  4. 1006 zynq-parallella.dtb
  5. 1007 zynq-zc702.dtb
  6. 1008 zynq-alientek.dtb
  7. 1009 zynq-zc706.dtb
  8. 1010 zynq-zc770-xm010.dtb
  9. 1011 zynq-zc770-xm011.dtb
  10. 1012 zynq-zc770-xm012.dtb
  11. 1013 zynq-zc770-xm013.dtb
  12. 1014 zynq-zed.dtb
  13. 1015 zynq-zybo.dt

复制代码

在第1007行的“zynq-zc702.dtb ”下方添加“zynq-alientek.dtb ”,这样编译Linux的时候就可以从zynq-alientek.dts编译出zynq-alientek.dtb文件了。
额外提一下,如果后面测试的时候只修改设备树的话可只重新编译设备树,在Linux内核源码根目录下输入如下命令编译设备树:

  1. make dtbs

复制代码

命令“make dtbs”只编译设备树文件,也就是将.dts编译为.dtb,编译完成以后就可以使用新的设备树文件。
18.2.3编译测试
经过前两个小节,我们已经在Linux内核里面已经添加了正点原子领航者开发板的配置,接下接进行编译测试。我们可以创建一个名为zynq.sh的编译脚本,脚本内容如下:

  1. 1 #!/bin/sh
  2. 2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
  3. 3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- alientek_zynq_defconfig
  4. 4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  5. 5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

复制代码

第2行,清理工程。
第3行,使用默认配置文件alientek_zynq_defconfig来配置Linux内核。
第4行,打开Linux的图形配置界面,如果不需要每次都打开图形配置界面可以删除此行。
第5行,编译Linux。
执行shell脚本zynq.sh编译Linux内核,编译完成以后就会在目录arch/arm/boot下生成zImage镜像文件,在arch/arm/boot/dts目录下生成zynq-alientek.dtb文件。将这两个文件拷贝到/tftpboot目录下,然后重启开发板,在uboot命令模式中使用tftpboot命令下载这两个文件并启动,命令如下:

  1. tftpboot 8000 zImage
  2. tftpboot 103cdda8 zynq-alientek.dtb
  3. bootz 8000 - 103cdda8

复制代码

只要出现如下图所示内容就表示Linux内核启动成功:


linux 怎么查看镜像在哪 linux的镜像文件_开发板_05


图 29.2.1 Linux内核启动

Linux内核启动成功,说明我们已经在Xilinx提供的Linux内核源码中成功添加了正点原子领航者开发板。
18.2.4根文件系统缺失错误
Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot或设备树文件的bootargs环境变量指定,bootargs会传递给Linux内核作为命令行参数。比如设置root=/dev/mmcblk0p2,也就是说根文件系统存储在/dev/mmcblk0p2中,也就是SD卡的分区2中。我们在17.2.10节制作SD启动卡时将SD卡分为两个分区,分区2就是用来存放根文件系统的,所以设置root=/dev/mmcblk0p2。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?这个问题是很常见的,我们在实际的工作中开发一个产品,这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的,必须要自己做根文件系统。在构建出对应的根文件系统之前Linux内核是没有根文件系统可用的,此时Linux内核启动以后会出现什么问题呢?带着这个问题,我们将bootargs环境变量改为“console= ttyPS0, 115200”,也就是不填写root的内容了,命令如下:

  1. setenv bootargs ‘console= ttyPS0, 115200’

复制代码

修改完成以后重新从网络启动,启动以后会有如下图所示错误:


linux 怎么查看镜像在哪 linux的镜像文件_linux 怎么查看镜像在哪_06


图 29.2.2根文件系统缺失错误

在上图中最后会有下面这一行:

  1. end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

复制代码

也就是提示内核崩溃,因为根文件系统目录不存在,VFS(虚拟文件系统)不能挂载根文件系统。即使根文件系统目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。
18.3image.ub的来源
从27.5.5上一节make zImage过程我们可以看到知道,编译linux内核后得到的是vmlinux、Image和zImage镜像文件,而我们使用Petalinux启动linux的时候使用的是image.ub镜像文件,那么image.ub文件是怎么产生的呢,是否一定需要image.ub文件才能启动内核呢?
由于我们编译内核并没有生成image.ub镜像文件,显然不是由内核编译产生的。在25.4.2节从网络启动Linux系统中我们分别使用了image.ub文件以及zImage文件和设备树文件启动linux,结果是都可以正常启动linux,说明启动linux内核并不一定需要image.ub文件,而且从中我们也可以得出一个信息,image.ub文件一定是包含zImage文件和设备树文件信息的。接下来,我们来探索下image.ub的来源。
既然image.ub文件包含zImage文件和设备树文件信息,那么image.ub文件一定是由某个工具打包制作而得到的,常用的镜像制作工具是mkimage,所以我们先用mkimage来分析image.ub文件,结果如图 29.3.1下图所示:。很庆幸,mkimage确实能分析出image.ub文件的信息,而且从显示的内容来看,image.ub确实是包括linux内核镜像和设备树的,另外从“FIT description”的信息来看,image.ub文件是U-Boot fitImage。现在我们根据“FIT description”的信息来搜索哪个文件包含该内容,搜索结果如图 29.3.2所示。


linux 怎么查看镜像在哪 linux的镜像文件_设备树_07


图 29.3.1 分析image.ub文件

庆幸的是,mkimage确实能分析出image.ub文件的信息,而且从上面显示的信息来看,image.ub确实是包括linux内核镜像和设备树的,另外从“FIT description”的信息来看,image.ub文件是U-Boot fitImage。现在我们根据“FIT description”的信息来搜索哪个文件包含该内容,搜索结果如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux镜像文件太大不好下载_08


图 29.3.2 搜索结果

可见包含该内容的文件不少。大致的看了一下以上文件,以“.its”结尾的文件是由run.do_assemble_fitimage_initramfs*文件生成的。我们打开build/tmp/deploy/images/plnx-zynq7/fitImage-its-4.14-xilinx-v2018.3+git999-r0-plnx-zynq7-20200303105834.its文件,内容如下:

  1. 1 /dts-v1/;
  2. 2
  3. 3 / {
  4. 4 description = "U-Boot fitImage for PetaLinux/4.14-xilinx-v2018.3+git999/plnx-zynq7";
  5. 5 #address-cells = <1>;
  6. 6
  7. 7 images {
  8. 8 kernel@1 {
  9. 9 description = "Linux kernel";
  10. 10 data = /incbin/("linux.bin");
  11. 11 type = "kernel";
  12. 12 arch = "arm";
  13. 13 os = "linux";
  14. 14 compression = "gzip";
  15. 15 load = <0x8000>;
  16. 16 entry = <0x8000>;
  17. 17 hash@1 {
  18. 18 algo = "sha1";
  19. 19 };
  20. 20 };
  21. 21 fdt@system-top.dtb {
  22. 22 description = "Flattened Device Tree blob";
  23. 23 data = /incbin/("/home/zynq/work/petalinux/zynq_linux/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.3+git999-r0/recipe-sysroot/boot/devicetree/system-top.dtb");
  24. 24 type = "flat_dt";
  25. 25 arch = "arm";
  26. 26 compression = "none";
  27. 27 hash@1 {
  28. 28 algo = "sha1";
  29. 29 };
  30. 30 };
  31. 31 };
  32. 32
  33. 33 configurations {
  34. 34 default = "conf@system-top.dtb";
  35. 35 conf@system-top.dtb {
  36. 36 description = "1 Linux kernel, FDT blob";
  37. 37 kernel = "kernel@1";
  38. 38 fdt = "fdt@system-top.dtb";
  39. 39
  40. 40
  41. 41 hash@1 {
  42. 42 algo = "sha1";
  43. 43 };
  44. 44 };
  45. 45 };
  46. 46 }

复制代码

可以看出该文件的内容与我们使用“mkimage -l images/linux/image.ub”得到的信息基本一致。另外,从该文件内容可以看到镜像的kernel来源于linux.bin,而设备树来源于工程目录下的build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.3+git999-r0/recipe-sysroot/boot/devicetree/system-top.dtb。从build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.3+git999-r0/temp/run.do_assemble_fitimage_initramfs.12249文件可知linux.bin是由vmlinux生成的。其实我们也可以用zImage来代替linux.bin,下面我们使用zImage和system-top.dtb生成imagde.ub。
将我们打开的.its文件另存为fitmage.its并将其放到linux源码根目录下,也就是“~/work/petalinux/linux-4.14/”目录下,然后修改相应的内容,修改后的fitmage.its文件内容如下:

  1. 1 /dts-v1/;
  2. 2
  3. 3 / {
  4. 4 description = "U-Boot fitImage for Alientek Navigator ZYNQ ";
  5. 5 #address-cells = <1>;
  6. 6
  7. 7 images {
  8. 8 kernel@1 {
  9. 9 description = "Linux kernel";
  10. 10 data = /incbin/("./arch/arm/boot/zImage");
  11. 11 type = "kernel";
  12. 12 arch = "arm";
  13. 13 os = "linux";
  14. 14 compression = "none";
  15. 15 load = <0x8000>;
  16. 16 entry = <0x8000>;
  17. 17 hash@1 {
  18. 18 algo = "sha1";
  19. 19 };
  20. 20 };
  21. 21 fdt@zynq-alientek.dtb {
  22. 22 description = "Flattened Device Tree blob";
  23. 23 data = /incbin/("./arch/arm/boot/dts/zynq-alientek.dtb");
  24. 24 type = "flat_dt";
  25. 25 arch = "arm";
  26. 26 compression = "none";
  27. 27 hash@1 {
  28. 28 algo = "sha1";
  29. 29 };
  30. 30 };
  31. 31 };
  32. 32
  33. 33 configurations {
  34. 34 default = "conf@zynq-alientek.dtb";
  35. 35 conf@zynq-alientek.dtb {
  36. 36 description = "1 Linux kernel, FDT blob";
  37. 37 kernel = "kernel@1";
  38. 38 fdt = "fdt@zynq-alientek.dtb";
  39. 39
  40. 40
  41. 41 hash@1 {
  42. 42 algo = "sha1";
  43. 43 };
  44. 44 };
  45. 45 };
  46. 46 };

复制代码

保存文件内容后,在终端中输入命令“mkimage -f fitimage.its image.ub”,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_设备树_09


图 29.3.3 生成image.ub文件

在内核根目录下可以找到生成的image.ub文件,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux 怎么查看镜像在哪_10


图 29.3.4 生成的image.ub文件

如何验证该文件确实可行呢。如果是通过SD卡启动领航者开发板可以将生成的image.ub文件复制到SD卡中,如果是通过网络启动领航者开发板,可以将其复制到/tftboot目录下,启动领航者开发板测试。经测试,是可以启动内核的,启动结果如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux 怎么查看镜像在哪_11


图 29.3.5 验证结果

至此,我们终于知道了image.ub是怎么来的,怎么生成的了。另外image.ub既然是U-Boot fitImage,那U-Boot fitImage又是什么呢?限于篇幅就不再介绍了,可自行上网搜索,笔者找到一篇不错的介绍,推荐下,链接如下:
http://www.wowotech.net/u-boot/fit_image_overview.html从该链接可知U-Boot fitImage主要来源于Unify Kernel的思想,其思想如下:
“在编译linux kernel的时候,不必特意的指定具体的架构和SOC,只需要告诉kernel本次编译需要支持哪些板级的platform即可,最终将会生成一个Kernel image,以及多个和具体的板子(哪个架构、哪个 SOC、哪个版型)有关的FDT image(dtb文件)。
bootloader在启动的时候,根据硬件环境,加载不同的dtb文件,即可使linux kernel运行在不同的硬件平台上,从而达到unify kernel的目标。”
18.4CPU调频策略及配置文件的修改
18.4.1CPU调频策略
1、设置领航者开发板的CPU调频策略
我们知道:主频越高,功耗也越高。为了节省CPU的功耗和减少发热,我们有必要根据当前CPU的负载状态,动态地提供刚好足够的主频给CPU。调频或称变频技术应运而生。变频技术作为电源管理技术以节能为目的加入linux内核。我们可以通过配置内核来选择不同的调频策略。
我们来看一下如何通过图形化界面配置Linux内核的CPU调频策略,输入“make menuconfig”打开Linux内核的图形化配置界面,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_设备树_12


图 29.4.1 Linux内核图形化配置界面

进入如下路径:

  1. CPU Power Management
  2. -> CPU Frequency scaling
  3. -> CPU Frequency scaling
  4. -> Default CPUFreq governor

复制代码

打开默认调频策略选择界面,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_开发板_13


图 29.4.2默认调频策略选择

可以看到Linux内核一共有6中调频策略,
①Performance,最高性能,直接用最高频率,不考虑耗电。
②Powersave,省电模式,通常以最低频率运行,系统性能会受影响,一般不会用这个。
③Userspace,可以在用户空间手动调节频率,可以看到这是默认的配置。
④Ondemand,定时检查负载,然后根据负载来调节频率。负载低的时候降低CPU频率以省电,负载高的时候提高CPU频率,增加性能。
⑤conservative:保守模式,类似于ondemand,但调整相对较缓。
⑥schedutil:4.7版本内核新增加的一种调度策略,可以直接使用调度程序提供的信息做出调整cpu频率的决策;也可以调用cpufreq驱动程序更改频率以立即调整CPU的性能,无需生成进程上下文或其他工作项。
我们可以根据实际需求选择合适的调频策略。
18.4.2配置文件的修改
在29.2.1节添加开发板默认配置文件时我们直接复制ZC702的配置文件,该文件能够使我们的领航者开发板启动linux内核,然而却不能保证所有的硬件都能够工作。因为官方的这份配置只是基础配置,随底层Vivado工程的不同需要添加额外的配置,如使能GPIO、IIC、以太网驱动等。当然了我们可以在linux内核的图形化配置界面配置,使能以后会保存到.config文件中。这样做是可以的,不过有两个问题,一个是我们得一个个的手动配置,比较麻烦,还要确保配置正确,二是当我们执行“make clean”清理工程以后.config文件就会被删除掉,因此我们所有的配置内容都会丢失,结果就是前功尽弃,一“删”回到解放前,所以我们可以直接使用第二十章的Petalinux工程里的linux配置。这个是Petalinux工具配置好的,从前面的使用来看基本上所有的外设都能使用。使用第二十章的Petalinux工程里的linux配置的方法有两种。
1、直接另存为.config文件为alientek_zynq_defconfig
既然linux的配置项保存在.config文件中,那么就可以直接将第二十章的Petalinux工程里的linux配置文件.config另存为alientek_zynq_defconfig,然后其复制到arch/arm/configs目录下,替换以前的alientek_zynq_defconfig。这样以后执行“make alientek_zynq_defconfig”重新配置Linux内核的时候就会使用新的配置文件。此种方式了解即可,不推荐。
2、通过图形界面保存配置文件
相比于第1种直接另存为.config文件,第2种方法就很“文雅”了。进入第二十章的Petalinux工程,在配置linux内核时,选择图形界面中的“< Save >”选项,在图形界面中保存配置文件,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux_14


图 29.4.3保存配置

通过键盘的“→”键,移动到“< Save >”选项,然后按下回车键,打开文件名输入对话框,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux 怎么查看镜像在哪_15


图 29.4.4输入文件名

在上图中输入要保存的文件名,可以带路径。比如我们要将新的配置文件保存到目录/home/zynq/work/ linux-xlnx-xilinx/arch/arm/configsarch/arm/configs下,文件名为alientek_zynq_defconfig,也就是用新的配置文件替换掉旧的默认配置文件。那么我们在上图中输入“/home/zynq/work/linux-xlnx-xilinx/arch/arm/configsarch/arm/configs/alientek_zynq_defconfig”即可,如下图所示:


linux 怎么查看镜像在哪 linux的镜像文件_linux 怎么查看镜像在哪_16


图 29.4.5输入文件名

设置好文件名以后选择下方的“< Ok >”按钮,保存文件并退出。这样当我们使用“make alientek_zynq_defconfig”重新配置Linux内核的时候就可以使用Petalinux配置好的内核。
关于Linux内核的移植就讲解到这里,简单总结一下移植步骤:
①在Linux内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。
②编译出参考板子对应的zImage和.dtb文件。
③使用参考板子的zImage文件和.dtb文件在我们所使用的板子上启动Linux内核,看能否启动。
④如果能启动的话就万事大吉,如果不能启动就需要调试Linux内核和修改设置树。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux内核用到的外设不多,一般就DRAM(Uboot都初始化好的)和串口。
⑤修改相应的驱动,像USB、EMMC、SD卡等驱动官方的Linux内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为Linux驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部MAC+外部PHY这种网络方案的话,一般网络驱动都很好处理,因为在Linux内核中是有外部PHY通用驱动的。只要设置好复位引脚、PHY地址信息基本上都可以驱动起来。
⑥Linux内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定Linux内核移植成功以后就要开始根文件系统的构建。