全志H3 Linux编译尝试

全志H3 Linux编译尝试

  1. 主要参考:https://blog.csdn.net/qq_40731414/article/details/118684473
  2. 部分内容介绍来自GPT,但是代码部分都会进行测试

一、简介

Linux编译的作用:

  1. 生成可执行的内核映像:编译Linux内核的主要目的是从源代码生成一个可执行的内核映像(例如,vmlinuz, zImage,
    bzImage等)。

  2. 自定义化:开发者可以通过配置选择哪些功能、驱动和模块应该包括在编译的内核中,从而进行内核的自定义。

  3. 性能优化:开发者可以针对特定的硬件或应用调优内核。

  4. 安全和维护:可以应用特定的安全补丁或者升级到新版本,从而保持系统的安全性。

Linux编译的流程:

  1. 获取源代码:首先,你需要获取Linux内核的源代码。这可以从官方网站 kernel.org 或特定的发行版提供的源代码仓库。
  2. 配置内核:
    使用make menuconfig、make xconfig或其他配置工具选择所需的内核选项。
    这将生成一个.config文件,该文件包含你选择的所有配置选项。
  3. 编译内核:
    使用make命令开始编译过程。
    编译完成后,你会在arch/[your_arch]/boot/目录下找到内核映像(例如zImage或bzImage)。
  4. 编译模块(如果需要的话):
    使用make modules命令编译内核模块。 使用make
    modules_install命令将模块安装到系统的模块目录(通常是/lib/modules/[kernel_version]/)。
  5. 安装内核:
    使用make install命令将内核映像及其他必要的文件(如System.map)安装到/boot目录。
    更新启动加载器配置(例如GRUB),以包含新的内核选项。
  6. 重启系统:最后,重启计算机并在启动加载器中选择新的内核版本。如果一切正常,系统应该会使用新的内核启动。
  7. 注意:在嵌入式系统或特定的场景中,流程可能会略有不同,例如可能需要交叉编译内核,或者需要手动将内核映像和模块复制到目标设备。

二、编译流程

一. 安装交叉编译器

系统使用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

全志H3 Linux编译尝试_第1张图片

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后,可以通过串口看到消息和进行操作。连接在串口引脚后,使用115200的波特率,可以读取到下面内容。并且通过串口进行shell交互。
全志H3 Linux编译尝试_第2张图片

四. 编译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 

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

4. 运行测试

全志H3 Linux编译尝试_第3张图片

四、格式化、分区、挂载SD卡

sudo fdisk -l显示以下内容

/dev/sdb1         49152    131071     81920   40M 83 Linux
/dev/sdb2        131072   2533375   2402304  1.1G 83 Linux
/dev/sdb3       2533376 124735487 122202112 58.3G 83 Linux

1. 格式化SD卡

插入SD卡,并使用lsblkfdisk -l命令来查看SD卡对应的设备文件名,通常可能是/dev/sdb/dev/mmcblk0

这里假设SD卡为/dev/sdb,请按照实际情况修改。

sudo umount /dev/sdb*
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10

2. 分区

使用fdisk工具来创建新的分区。

sudo fdisk /dev/sdb

fdisk工具中,按照以下步骤创建分区:

  • 输入 n 创建新分区
  • 输入 p 选择主分区
  • 输入 1 创建第一分区
  • 回车选择默认起始扇区
  • 输入 +40M 设置第一分区大小为40M
  • 输入 n 创建第二分区
  • 输入 p 选择主分区
  • 输入 2 创建第二分区
  • 回车选择默认起始扇区
  • 输入 +1.1G 设置第二分区大小为1.1G
  • 输入 n 创建第三分区
  • 输入 p 选择主分区
  • 输入 3 创建第三分区
  • 回车选择默认起始扇区
  • 回车使用剩余空间
  • 输入 w 保存更改并退出

3. 格式化分区

sudo mkfs.ext4 /dev/sdb1
# sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mkfs.ext4 /dev/sdb3

4. 挂载分区

创建挂载点目录:

sudo mkdir -p /media/tju/boot
sudo mkdir -p /media/tju/rootfs
sudo mkdir -p /media/tju/userdata

挂载分区:

sudo mount /dev/sdb1 /media/tju/boot
sudo mount /dev/sdb2 /media/tju/rootfs
sudo mount /dev/sdb3 /media/tju/userdata

完成以上步骤后,您就可以将编译好的U-Boot、内核zImage、设备树文件和rootfs复制到相应的挂载目录中,或者在这些目录中进行更多的操作了。

取消挂载:

sudo umount /media/tju/boot
sudo umount /media/tju/rootfs
sudo umount /media/tju/userdata

你可能感兴趣的:(linux,运维,服务器)