对于有LINUX内核技术基础的兰友来说,可以尝试按照本文的内容自己构建LINUX内核,修改编译选项、调整代码,然后进行编译和更新,做各种试验。

1. 下载内核

下载地址:https://gedu.oss-cn-beijing.aliyuncs.com/Products/YourLand/Release/OpenSourceKernel/opsrckrn.tar.gz

完成内核的下载后需要对压缩包进行解压。

2. 准备构建环境

2.1 使用AMD64架构机器

  1. 交叉编译工具下载链接:https://gedu.oss-cn-beijing.aliyuncs.com/Products/YourLand/Release/OpenSourceKernel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.gz

  2. 设置环境变量CROSS_COMPILE=XXXX

交叉工具链设置示例:

1. 添加交叉编译工具链的可执行文件路径
/path/to/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin

bin目录下有如下的内容
ls toolchains/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/
aarch64-none-linux-gnu-addr2line  aarch64-none-linux-gnu-elfedit     aarch64-none-linux-gnu-gcov           aarch64-none-linux-gnu-ld        aarch64-none-linux-gnu-ranlib
aarch64-none-linux-gnu-ar         aarch64-none-linux-gnu-g++         aarch64-none-linux-gnu-gcov-dump      aarch64-none-linux-gnu-ld.bfd    aarch64-none-linux-gnu-readelf
aarch64-none-linux-gnu-as         aarch64-none-linux-gnu-gcc         aarch64-none-linux-gnu-gcov-tool      aarch64-none-linux-gnu-ld.gold   aarch64-none-linux-gnu-size
aarch64-none-linux-gnu-c++        aarch64-none-linux-gnu-gcc-11.2.1  aarch64-none-linux-gnu-gdb            aarch64-none-linux-gnu-lto-dump  aarch64-none-linux-gnu-strings
aarch64-none-linux-gnu-c++filt    aarch64-none-linux-gnu-gcc-ar      aarch64-none-linux-gnu-gdb-add-index  aarch64-none-linux-gnu-nm        aarch64-none-linux-gnu-strip
aarch64-none-linux-gnu-cpp        aarch64-none-linux-gnu-gcc-nm      aarch64-none-linux-gnu-gfortran       aarch64-none-linux-gnu-objcopy
aarch64-none-linux-gnu-dwp        aarch64-none-linux-gnu-gcc-ranlib  aarch64-none-linux-gnu-gprof          aarch64-none-linux-gnu-objdump

2. make时添加交叉编译参数
CROSS_COMPILE=aarch64-none-linux-gnu-

2.2 使用ARM64架构机器

使用原生ARM64架构的机器进行编译时,推荐使用的gcc的版本是gcc-11

gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/11/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-4ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-4ubuntu1)

3 更新内核配置选项

通过下方的命令指定内核选项配置文件,并将内核选项配置文件中的内容更新到.config文件内。

如果缺少linux_opsrc_rk3588_defconfig请通过下方链接下载文件。

下载链接:https://gedu.oss-cn-beijing.aliyuncs.com/Products/YourLand/Release/OpenSourceKernel/linux_opsrc_rk3588_defconfig

make ARCH=arm64 LOCALVERSION=-opensources-rk3588 linux_opsrc_rk3588_defconfig

其中linux_opsrc_rk3588_defconfig是指定的文件名,手动指定的文件需要在
arch/arm64/configs/目录内存在。

ls arch/arm64/configs/
amlogic_gki.fragment               gki_defconfig                        px30_linux_robot_defconfig  rk3326_linux_robot_defconfig  rk3588_linux.config      rockchip_gki.fragment
db845c_gki.fragment                hikey960_gki.fragment                rk1808_linux_defconfig      rk3358_linux.config           rk3588_nvr.config        rockchip_linux_defconfig
defconfig                          linux-rockchip-rk356x-legacy.config  rk1808_x4_linux_defconfig   rk3399pro_npu_defconfig       rockchip_cros_defconfig  rockchip_rt.config
fips140_gki.fragment               linux_opsrc_rk3588_defconfig         rk3308_linux_defconfig      rk3568_nvr.config             rockchip_defconfig       rockpi4_defconfig
fips140_gki_eval_testing.fragment  px30_linux_defconfig                 rk3326_linux.config         rk3588_edge.config            rockchip_gki.config

4. 编译内核

可以使用下面的命令对Image、内核模块、设备树进行编译。

make ARCH=arm64 LOCALVERSION=-opensources-rk3588 Image modules dtbs

5. 更新内核启动文件

完成内核的编译后,可以将生成的文件更新到幽兰内。

内核启动文件替换位置:/boot/Image

6. 设置grub

对于使用双剑镜像版本的用户,内核文件是根据grub.cfg中的设置进行加载的,请确保grub.cfg文件中所使用的内核文件路径是你所期望的。

grub.cfg文件所在位置:/boot/grub/grub.cfg

grub.cfg文件内容(在下面可以看到不同的选择设置不同的内核文件Image-xxx和initrd.img):

set debug="loader,mm"
set term="vt100"
set default="0"
set timeout="1"

search --set=root --fs-uuid 8243-61A8

menuentry 'Boot YourLand by GEDU Kernel' {
        linux /Image-gedu resume=UUID=4cb35644-114d-4566-a1f2-01d986a77985 root=PARTUUID=9ab6bd62-ac07-a64f-83bc-8ee1accf4bec noresume psi=1 splash label=debug rootwait verbose debug nokaslr
        initrd /initrd.img-5.10.110-rockchip-rk3588
}
menuentry 'Boot YourLand by My Kernel' {
        linux /Image-opsrc resume=UUID=4cb35644-114d-4566-a1f2-01d986a77985 root=PARTUUID=9ab6bd62-ac07-a64f-83bc-8ee1accf4bec noresume psi=1 splash label=debug rootwait verbose debug nokaslr
        initrd /initrd.img-5.10.110-opensources-rk3588
}

你可以把上面的My换成你自己的名字。

作者:沈根成  创建时间:2024-01-09 09:27
最后编辑:Zhang Yinkui  更新时间:2024-05-06 17:42