- 主要参考: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
从https://download.friendlyelec.com/nanopineo下载编译器arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz
cd
mkdir nanopi
cd nanopi
tar -xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz
在~/.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
arm-linux-gcc -v
注意在.bashrc中添加的路径,无法在sudo中运行,但可以通过添加完整路径,即/home/tju/nanopi/4.9.3/bin/arm-linux-gcc运行。
使用交叉编译器的作用是,可以通过高性能x86系统,使用arm-linux-gcc,为H3芯片预编译好一些文件、库和模块。
预装一个系统的作用是,简化了硬盘分区,去除了不重要的操作。
另外,由于还是新手,还不太懂完全从新的SD卡进行全部操作。
从https://download.friendlyelec.com/nanopineo下载系统,下载h3_sd_friendlycore-xenial_4.14_armhf_20210618.img.zip
。我使用其他系统,发现无法正常运行。
使用烧录工具,进行烧录
U-boot(通常称为"Das U-Boot")是一个流行的开源启动加载器,经常用于嵌入式系统和各种其他设备。U-boot的主要作用是初始化硬件并加载操作系统内核。
U-boot在嵌入式系统中充当了桥梁,负责从设备上电到操作系统启动的过程。编译U-boot的目的是生成一个适用于特定硬件平台的启动加载器,以便正确地初始化硬件并加载操作系统。
cd ~/nanopi/
git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
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。
查看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
网上说,编译了U-boot后,可以通过串口看到消息和进行操作。连接在串口引脚后,使用115200的波特率,可以读取到下面内容。并且通过串口进行shell交互。
编译Linux内核的主要作用:定制化支持:为特定的硬件和应用配置和优化内核。新特性与修复:引入新的驱动、补丁或安全修复。性能优化:去除不必要的模块和功能,使内核更轻量和高效。
cd ~/nanopi/
git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
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分区。
lsblk # 查看boot挂在目录
cp arch/arm/boot/zImage /media/tju/boot/
cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb /media/tju/boot/
由于使用了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的编译
#include
int main(void) {
printf("hello\n");
return 0;
}
gcc test.cpp -o test1
arm-linux-gcc -o test2
chmod +x test1 test2
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
插入SD卡,并使用lsblk
或fdisk -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
使用fdisk
工具来创建新的分区。
sudo fdisk /dev/sdb
在fdisk
工具中,按照以下步骤创建分区:
n
创建新分区p
选择主分区1
创建第一分区+40M
设置第一分区大小为40Mn
创建第二分区p
选择主分区2
创建第二分区+1.1G
设置第二分区大小为1.1Gn
创建第三分区p
选择主分区3
创建第三分区w
保存更改并退出sudo mkfs.ext4 /dev/sdb1
# sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mkfs.ext4 /dev/sdb3
创建挂载点目录:
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