[RK356x] [Firefly-Linux] 10min带你获取了解与编译Kernel源代码

Posted Neutionwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[RK356x] [Firefly-Linux] 10min带你获取了解与编译Kernel源代码相关的知识,希望对你有一定的参考价值。

🍇 博主主页:Systemcall小酒屋
🍇 博主简介:Neutionwei,C站嵌入式领域新星创作者之一,一枚热爱开源技术、喜欢分享技术心得的极客,注重简约风格,热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是厦大一位教数学的院士说过的一句话,另外“成就是最好的老师”,技术既要沉淀,也得分享,成就感的正反馈是支持我持续耕耘的动力!
🍇 专栏目录:Firefly-RK356x板卡
🍇 专栏说明:本专栏主要基于Firefly旗下的RK356x板卡进行入门篇讲述,欢迎订阅,博主会持续更新!

一、Kernel获取

RK356x平台Kernel源代码获取的方式有两种,第一是直接下载Firefly官方SDK并同步即自动生成Kernel目录,第二是在代码托管仓库GitHub或者GitLab抓取,第三种是使用repo抓取rk356x_linux_bsp_release.xml

第一种方式可以参考以下文章:

https://blog.csdn.net/Neutionwei/article/details/121638947

第二种方式:

# 从 GitLab 中抓取 Kernel 源代码
$ git clone https://gitlab.com/firefly-linux/kernel.git
# 切换为 RK356x 分支
$ git checkout -b rk356x/firefly remotes/origin/rk356x/firefly
# 从 GitLab 中抓取 tools
$ git clone https://gitlab.com/firefly-linux/tools.git
# 切换为 RK356x 分支
$ git checkout -b rk356x/firefly remotes/origin/rk356x/firefly
$ mkdir device
$ cd device
# 从 GitLab 中抓取 device/rockchip
$ git clone https://gitlab.com/firefly-linux/device/rockchip.git
# 切换为 RK356x 分支
$ git checkout -b rk356x/firefly remotes/origin/rk356x/firefly

第三种方式:

$ mkdir rk356x_linux_bsp
$ cd rk356x_linux_bsp
# BSP 包括 device/rockchip 、docs 、 kernel 、 u-boot 、 rkbin 、 tools 和交叉编译链
$ repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u  \\
https://gitlab.com/firefly-linux/manifests.git -b master -m rk356x_linux_bsp_release.xml
# 同步
$ .repo/repo/repo sync -l
$ .repo/repo/repo sync -c --no-tags
$ .repo/repo/repo start firefly --all

二、Kernel根目录

RK356x平台Kernel根目录如下:

以下是各个子目录或文件的介绍!

2.1 Documentation/

Documentation/是内核文档手册相关目录,大部分软件框架的介绍都有相关说明,但是更新比较慢:

2.1 arch/

芯片架构文件相关目录,RK356x属于arm64架构:

以下设备树dts相关目录,RK356x的dts文件存放于rockchip/目录:

以下RK356x相关dts文件:

以下config配置文件:

2.2 block/

block/是块设备相关目录,像 SD 卡、EMMC、NAND、SSD等存储设备属于块设备,目录中存放着管理块设备的相关文件:

2.3 boot.its

boot.its是属于 Fit 打包格式描述文件,描述Kernel固件如何打包。

2.4 drivers/

drivers/是设备驱动相关目录,根据驱动类型的不同,分门别类进行整理,比如 drivers/i2c 就是 I2C 相关驱动目录:

2.5 firmware/

固件相关目录,默认只有一个 Makefile文件:

2.6 fs/

文件系统相关目录,存放文件系统,比如 fs/ext2fs/ext4fs/f2fs 等,分别是 ext2ext4f2fs 等文件系统:

2.7 include/

头文件相关目录,#include <xxx.h>包含就是这个目录下的头文件:

2.8 init/

初始化相关目录,存放 Linux 内核启动的时候初始化代码:

2.9 ipc/

进程间通信相关目录,存放进程间通信的具体实现代码:

2.10 kernel/

内核相关目录:

2.11 lib/

库相关目录,都是一些公用的库:

2.12 logo.bmp、logo_kernel.bmp

内核加载过程显示 logo 的 bmp 格式文件:

2.13 mm/

mm/是内存管理相关目录:

2.14 net/

网络相关目录:

2.15 ramdisk.img

ramdisk.img是 Firefly 提供的 initramfs,在根文件系统损坏的情况下会进入这个文件系统(如果没有initramfs,Kernel 找不到根文件系统默认会出错)。

2.16 samples/

例程相关目录:

2.17 scripts/

脚本相关目录,编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中:

2.18 sound/

音频处理相关目录:

2.19 tools/

工具相关目录:

2.20 usr/

initramfs 相关的目录,用于生成 initramfs

2.21 virt/

virt/目录提供虚拟机技术支持 (KVM):

2.22 Makefile、Kbuild、Kconfig、config.mk

这四个文件配合script/目录一起配置与编译使用。

2.23 其他(较少关心)

目录/文件描述
COPYING版权声明
CREDITSLinux 贡献者
LICENSES/开源许可
MAINTAINERS维护者名单
OWNERSandroid 主线 OWNERS
READMELinux 描述文件
android/安卓相关目录
build.config.*安卓相关编译配置文件
certs/签名检查证书相关目录
crypto/加密相关目录,存放着加密算法文件,比如常见的 crc、crc32、md4、md5、hash 等加密算法
security/安全相关目录

三、编译Kernel

3.1 编译环境

$ sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \\
expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \\
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \\
unzip device-tree-compiler python-pip ncurses-dev python-pyelftools

3.2 查看配置文件

$ ls device/rockchip/rk356x/

3.3 假设编译roc-rk3568-pc-ubuntu

$ ./build.sh roc-rk3568-pc-ubuntu.mk
$ ./build.sh kernel

编译完成:

3.4 编译后文件

目录/文件描述
Module.*与模块有关一系列文件
System.map符号表
boot.img最终烧录 Kernel 文件(由 Image、ramdisk.img、resource.img 打包而成 )
kernel.img由 Image 打包而成
resource.img由设备树 DTB 与 logo 文件打包而成
vmlinux编译出来的、未压缩的 ELF 格式 Linux 文件
vmlinux.o编译生成的 vmlinux object文件
zboot.img由 Image.lz4、ramdisk.img、resource.img 打包而成

以上是关于[RK356x] [Firefly-Linux] 10min带你获取了解与编译Kernel源代码的主要内容,如果未能解决你的问题,请参考以下文章

[RK356x] [Firefly-Linux] 一节课间时间带你了解Ubuntu固件各个分区

[RK356x] [Firefly-Linux] 一节课间时间带你了解Linux_SDK

[RK356x] [Firefly-Linux] 10min带你获取了解与编译Kernel源代码

[RK356x] [Firefly-Linux] 一节课间时间教你单独更新Kernel到Ubuntu系统的boot分区

[RK356x] [Firefly-Linux] 10min带你获取了解与编译U-Boot源代码

RK356x U-Boot研究所(引导篇)1.1 BootLoader引导过程浅析