面向ARM处理器的Linux内核编译及调试方法

1 NXP IMX官方开发板

1.1 NXP IMX官方开发板Linux编译

  • NXP提供的 Linux 源码肯定是面向 I.MX6ULL EVK 开发板上运行的

image.png

  • Linux源码目录结构

image.png

  • 修改顶层 Makefile

image.png

  • 配置并编译Linux内核,和uboot一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认配置文件,这些默认配置文件保存 在 arch/arm/configs 目录中。imx_v7_defconfig和imx_v7_mfg_defconfig 都可作为 I.MX6ULL EVK 开发板所使用的默认配置文件。
  • 这里建议使用 imx_v7_mfg_defconfig 这个默认配置文件,首先此配置文件默认支持 I.MX6UL 这款芯片,而且重要的一点就是此文件编译出来的 zImage可以通过 NXP 官方提供的 MfgTool 工具烧写!!imx_v7_mfg_defconfig 中的“mfg”的意思就是 MfgTool。
    进入到 Ubuntu 中的 Linux 源码根目录下,执行如下命令配置 Linux 内核:
    make clean  //第一次编译 Linux 内核之前先清理一下
    make imx_v7_mfg_defconfig //配置 Linux 内核
    make -j16  //编译 Linux 内核
复制代码
  • Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件。

image.png

image.png

1.3 从网络启动Linux方法

  • ftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa下:
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
复制代码
  • TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,命令如
mkdir /home/zuozhongkai/linux/tftpboot
chmod 777 /home/zuozhongkai/linux/tftpboot
复制代码
  • 配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:
示例代码 30.4.4.1 /etc/xinetd.d/tftp 文件内容
1 server tftp
2 {
3 socket_type = dgram
4 protocol = udp
5 wait = yes
6 user = root
7 server = /usr/sbin/in.tftpd
8 server_args = -s /home/zuozhongkai/linux/tftpboot/
9 disable = no
10 per_source = 11
11 cps = 100 2
12 flags = IPv4
13 }

复制代码
  • 完了以后启动 tftp 服务,打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容
sudo service tftpd-hpa start

示例代码 30.4.4.2 /etc/default/tftpd-hpa 文件内容
1 # /etc/default/tftpd-hpa
2
3 TFTP_USERNAME="tftp"
4 TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"
5 TFTP_ADDRESS=":69"
6 TFTP_OPTIONS="-l -c -s"
复制代码
  • TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限
  • 最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
复制代码
  • 从网络启动 linux 系统的唯一目的就是为了调试!不管是为了调试 linux 系统还是 linux 下的驱动。每次修改 linux 系统文件或者 linux 下的某个驱动以后都要将其烧写到 EMMC 中去测试,这样太麻烦了。我们可以设置 linux 从网络启动,也就是将 linux 镜像文件和根文件系统都放到 Ubuntu 下某个指定的文件夹中,这样每次重新编译 linux 内核或者某个 linux 驱动以后只需要使用 cp 命令将其拷贝到这个指定的文件夹中即可,这样就不用需要频繁的烧写 EMMC,这样就加快了开发速度。
  • 前提是要将zImage 和设备树文件放到 Ubuntu 下的 tftp 目录中,设置 bootargs 和 bootcmd 这两个环境变量。 bootargs 会 传 递 给 Linux 内 核 作 为 命 令 行 参 数 。 比 如上面设 置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2 中,也就是 EMMC 的分区 2中。
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv
复制代码
  • 设置好以后直接输入 boot,或者 run bootcmd 即可启动 Linux 内核,如果 Linux 内核启动成功的话就会输出如下图所示的启动信息
boot
复制代码

1.2 NXP IMX官方开发板Linux系统调试

  • 在测试之前确保 uboot 中的环境变量 bootargs 内容如下:
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait r
复制代码
  • Linux 内核启动以后是需要根文件系统的,根文件系统存在哪里是由 uboot 的 bootargs 环境变 量 指 定 , bootargs 会 传 递 给 Linux 内 核 作 为 命 令 行 参 数 。 比 如上面设 置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2 中,也就是 EMMC 的分区 2中。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现报错。
  • 将1.1节编译出来的 zImage 和 imx6ull-14x14-evk.dtb 复制到 Ubuntu 中的 tftp 目录下,本文的tftp目录是/home/zuozhongkai/linux/tftpboot/
cp arch/arm/boot/zImage /home/zuozhongkai/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/zuozhongkai/linux/tftpboot/ -f
复制代码
  • 拷贝完成以后就可以测试了,启动开发板,进入 uboot 命令行模式,然后输入如下命令将

zImage 和 imx6ull-14x14-evk.dtb 下载到开发板中并启动:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
复制代码

image.png

猜你喜欢

转载自juejin.im/post/7018749592246157348