您现在的位置是:首页 >其他 >编译odroid-xu4的Ubuntu系统kernel操作指导网站首页其他

编译odroid-xu4的Ubuntu系统kernel操作指导

逆鳞_Kevin 2024-07-03 12:01:03
简介编译odroid-xu4的Ubuntu系统kernel操作指导

1. 下载kernel和gcc

1.1 下载kernel源码

ODROID-XU4的kernel源码下载路径:https://github.com/hardkernel/linux/tree/odroidxu4-4.9.y
下载方式选择Download ZIP或使用git都可;

这里,我尝试通过git clone将kernel源码下载到本地Ubuntu系统,git命令如下:

git clone https://github.com/hardkernel/linux.git -b odroidxu4-4.9.y

但git下载时间很长甚至出现断连的情况,而通过Download ZIP方式会较快下载完成。

1.2 安装配套版本的gcc工具

gcc工具下载链接:
http://dn.odroid.com/ODROID-XU/compiler/arm-eabi-4.6.tar.gz

1.2.1 gcc工具包放入/opt/toolchains

gcc工具包下载到本地Downloads目录后,将其放入到/opt/toolchains目录,操作命令如下:

$ sudo mkdir /opt/toolchains
$ sudo tar xvfz arm-eabi-4.6.tar.gz -C /opt/toolchains

示例:
在这里插入图片描述

1.2.2 添加环境变量到~/.bashrc文件中

打开.bashrc文件:

vim ~/.bashrc
或
vim $HOME/.bashrc

在.bashrc文件的末尾添加以下内容,这里是通过vim打开.bashrc文件的:

export ARCH=arm
export PATH=${PATH}:/opt/toolchains/arm-eabi-4.6/bin
export CROSS_COMPILE=arm-eabi-

示例:
在这里插入图片描述
添加完成后,执行<:wq>保存退出,可以使用cat ~/.bashrc命令查看环境变量是否添加成功;

之后,使用source命令保留当前shell配置的环境变量(source命令通常用于保留、更改当前shell中的环境变量),命令如下:

source ~/.bashrc

这样,当系统重启之后,先前新增或修改的环境变量依然能够使用。

1.2.3 检查gcc工具是否安装成功

执行如下命令:

arm-eabi-gcc -v

在这里插入图片描述
从中可以看到gcc已安装成功,显示当前的path和version

1.2.4 有关安装gcc的其他问题

事实上,在安装完gcc后,也不一定能够完全可以使用,如:

  1. gcc交叉编译器与系统不兼容,如:64位Linux系统下无法兼容32位交叉编译器;
  2. 在gcc编译时报错,提示gcc未找到;
  3. gcc版本过多,需要切换到指定的gcc版本;
    在这里插入图片描述

上面3个问题的解决方式,均可以在网上找到解决方式,这里不再做过多描述。

2. 编译kernel

2.1 解压kernel并授权777权限

将通过Download ZIP方式下载好的zip压缩文件存放到新建的xu4-kernel目录下,使用unzip命令进行解压:

unzip linux-odroidxu4-4.9.y.zip

解压完成后,再进行文件夹授权:

chmod -R 777 *

2.2 编译kernel源码

进入linux-odroidxu4-4.9.y目录中,configure Kernel:

cd linux-odroidxu4-4.9.y
make odroidxu4_defconfig

修改kernel配置(可选):

make menuconfig 

执行上面的make menuconfig命令后,会跳转至kernel配置界面,如下:
在这里插入图片描述
按照自己的需求配置完成之后,选择“Exit”退出该界面

之后,编译kernel:

make -j8/-j16

2.3 编译失败及解决方法

我在编译过程中,碰到编译失败的模块,如下所示:
在这里插入图片描述
报错模块出现在drivers/net/wireless/rtl8723du中,排查对应的rtw_cmd.c文件,未能找到报错原因,且该模块在系统中未能用到,最后只好去掉对rtl8723du模块的make操作,操作如下:
进入drivers/net/wireless目录,打开makefile文件,注释掉对rtl8723du模块的编译
在这里插入图片描述
之后,kernel编译便通过了

3. 更新kernel到指定存储设备

假设USB存储卡读卡器被分配在/dev/sdb上

3.1 挂载存储卡

3.1.1 若存储卡为eMMC卡

执行如下操作命令:

mkdir -p mount
mount /dev/sdb1 ./mount
cp -f arch/arm/boot/zImage /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu4.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3-lite.dtb /media/boot
sync

之后,取消挂载/dev/sdb1,重新挂载到/dev/sdb2上,执行剩余的命令:

umount ./mount
mount /dev/sdb2 ./mount
make modules_install ARCH=arm INSTALL_MOD_PATH=./mount && sync && sudo umount ./mount
rm -rf mount

3.1.2 若存储卡为eMMC卡

执行如下操作命令:

mkdir -p mount
mount /dev/sdb ./mount
make modules_install
cp -f arch/arm/boot/zImage /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu4.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3-lite.dtb /media/boot
sync

3.2 确认文件无误后,reboot

在重新启动之前,检查所有必要的文件是否就位,如下所示,文件大小会有所不同:

$ ls -l /media/boot/
total 14756
-rwxr-xr-x 1 root root    9536 Oct 25 23:29 boot.ini
-rwxr-xr-x 1 root root     753 Aug 20 22:38 boot.ini.default
-rwxr-xr-x 1 root root   62565 Nov  2 01:24 exynos5422-odroidxu3.dtb
-rwxr-xr-x 1 root root   61814 Nov  2 01:24 exynos5422-odroidxu3-lite.dtb
-rwxr-xr-x 1 root root   62225 Nov  2 01:24 exynos5422-odroidxu4.dtb
-rwxr-xr-x 1 root root   61714 Oct 25 23:30 exynos5422-odroidxu4-kvm.dtb
-rwxr-xr-x 1 root root 9996513 Nov  2 01:27 uInitrd
-rwxr-xr-x 1 root root 4844744 Nov  2 01:24 zImage

最后,reboot,即可更新系统中的kernel

这里需要注意的是,存储卡中存放的Ubuntu系统版本和kernel版本需要配套,否则可能会出现kernel更新失败的情况。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。