全志H3 Linux编译尝试
- 主要参考:https://blog.csdn.net/qq_40731414/article/details/118684473
- 部分内容介绍来自GPT,但是代码部分都会进行测试
一、简介
Linux编译的作用:
生成可执行的内核映像:编译Linux内核的主要目的是从源代码生成一个可执行的内核映像(例如,vmlinuz, zImage,
bzImage等)。自定义化:开发者可以通过配置选择哪些功能、驱动和模块应该包括在编译的内核中,从而进行内核的自定义。
性能优化:开发者可以针对特定的硬件或应用调优内核。
安全和维护:可以应用特定的安全补丁或者升级到新版本,从而保持系统的安全性。
Linux编译的流程:
- 获取源代码:首先,你需要获取Linux内核的源代码。这可以从官方网站 kernel.org 或特定的发行版提供的源代码仓库。
- 配置内核:
使用make menuconfig、make xconfig或其他配置工具选择所需的内核选项。
这将生成一个.config文件,该文件包含你选择的所有配置选项。- 编译内核:
使用make命令开始编译过程。
编译完成后,你会在arch/[your_arch]/boot/目录下找到内核映像(例如zImage或bzImage)。- 编译模块(如果需要的话):
使用make modules命令编译内核模块。 使用make
modules_install命令将模块安装到系统的模块目录(通常是/lib/modules/[kernel_version]/)。- 安装内核:
使用make install命令将内核映像及其他必要的文件(如System.map)安装到/boot目录。
更新启动加载器配置(例如GRUB),以包含新的内核选项。- 重启系统:最后,重启计算机并在启动加载器中选择新的内核版本。如果一切正常,系统应该会使用新的内核启动。
- 注意:在嵌入式系统或特定的场景中,流程可能会略有不同,例如可能需要交叉编译内核,或者需要手动将内核映像和模块复制到目标设备。
二、编译流程
一. 安装交叉编译器
系统使用ubuntu18.04
1. 下载:
从https://download.friendlyelec.com/nanopineo下载编译器arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz
2. 解压:
cd
mkdir nanopi
cd nanopi
tar -xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz
3. 添加路径:
在~/.bashrc中添加该gcc路径,nano ~/.bashrc
# nanopi
# export PIPATH=[your home path]/nanopi/4.9.3
export PIPATH=/home/tju/nanopi/4.9.3
export PATH=$PATH:$PIPATH/bin
4. 验证:
arm-linux-gcc -v
5. 注意:
注意在.bashrc中添加的路径,无法在sudo中运行,但可以通过添加完整路径,即/home/tju/nanopi/4.9.3/bin/arm-linux-gcc运行。
6. 作用:
使用交叉编译器的作用是,可以通过高性能x86系统,使用arm-linux-gcc,为H3芯片预编译好一些文件、库和模块。
二. 为SD卡预装一个系统
预装一个系统的作用是,简化了硬盘分区,去除了不重要的操作。
另外,由于还是新手,还不太懂完全从新的SD卡进行全部操作。
1. 下载
从https://download.friendlyelec.com/nanopineo下载系统,下载h3_sd_friendlycore-xenial_4.14_armhf_20210618.img.zip
。我使用其他系统,发现无法正常运行。
2. 烧录
使用烧录工具,进行烧录
三. 编译U-boot
U-boot(通常称为"Das U-Boot")是一个流行的开源启动加载器,经常用于嵌入式系统和各种其他设备。U-boot的主要作用是初始化硬件并加载操作系统内核。
U-boot在嵌入式系统中充当了桥梁,负责从设备上电到操作系统启动的过程。编译U-boot的目的是生成一个适用于特定硬件平台的启动加载器,以便正确地初始化硬件并加载操作系统。
1. 下载
cd ~/nanopi/
git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
2. 编译
sudo apt-get install swig python-dev python3-dev
cd ~/nanopi/u-boot
make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make ARCH=arm CROSS_COMPILE=arm-linux-
成功后生成u-boot-sunxi-with-spl.bin
文件,可用于更新SD上的U-boot。
3. 更新
查看SD卡的设备号
lsblk
# 可以看到设备为sdb,并且分成了3个分区和挂在的目录,分别为/media/tju/root/等
cd ~/nanopi/u-boot
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
sync && eject /dev/sdb
4. 其他
网上说,编译了U-boot后,可以通过串口看到消息和进行操作。有机会再测试一下。
四. 编译Linux内核
编译Linux内核的主要作用:定制化支持:为特定的硬件和应用配置和优化内核。新特性与修复:引入新的驱动、补丁或安全修复。性能优化:去除不必要的模块和功能,使内核更轻量和高效。
1. 下载
cd ~/nanopi/
git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
2. 编译
sudo apt-get install u-boot-tools
cd linux
touch .scmversion
make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
编译完成后会在arch/arm/boot/
目录下生成zImage,并且在arch/arm/boot/dts/
目录下生成dtb文件,用于更新SD卡的boot分区。
3. 更新zImage和dtb文件
lsblk # 查看boot挂在目录
cp arch/arm/boot/zImage /media/tju/boot/
cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb /media/tju/boot/
4. 更新驱动模块
由于使用了sudo,因此CROSS_COMPILE使用完整路径
sudo make modules_install INSTALL_MOD_PATH=/media/tju/rootfs/ ARCH=arm CROSS_COMPILE=/home/tju/nanopi/4.9.3/bin/arm-linux-
该操作可以实现对lib文件夹进行更新。
三. 使用交叉编译器
使用交叉编译器,可以在X86完成对arm的编译
1. 写一个简单的c语言程序,test.cpp
#include <stdio.h>
int main(void) {
printf("hello\n");
return 0;
}
2. 进行普通编译和交叉编译
gcc test.cpp -o test1
arm-linux-gcc -o test2
3. 复制到H3上
chmod +x test1 test2