嵌入式linux(基于飞腾派)

首先看一下phytiumpi OS 的目录结构

ren@phytiumpi:/$ ls
bin  boot  data  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

一. 工具链

1.1 GNU(自由软件操作系统)操作组件

1.binutils:汇编器、链接器
2.GCC(GNU Compiler Collection):GNU编译器集合
可编译语言都使用一个生成汇编的通用后端,然后反馈到GNU编译器
3.c库:基于POSIX标准的应用程序编程接口(API)

1.2 工具链类型

1.跨平台工具链(交叉工具链):用于编译目标系统的工具链
2.原生工具链(本机工具链):用于编译主机系统的工具链
几乎所有linux开发都使用交叉工具链完成

1.2 cpu架构

命令:查看构建工具链的元组

$ gcc -dumpmachine

1.3 C库

application(应用程序)->C library(c库)->linux kernel(linux内核)



二.工具链剖析

工具链一般位于usr/bin/目录下
了解配置信息

$ aarch64-linux-gnu-gcc --version

aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE

具体配置信息

$ aarch64-linux-gnu-gcc -v

Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/12/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 12.2.0-14' --with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-12 --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-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
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Debian 12.2.0-14)

2.1 sysroot

sysroot:指定交叉工具链的根目录

***@phytiumpi:/usr/aarch64-linux-gnu$ ls
include  lib

include:所有库的头文件目录
lib:包含c库和动态链接器/加载器的库文件

2.2 c库的组件

1.libc:C语言标准库
2.libm:C语言数学库
3.libpthread:线程库
4.librt:实时拓展库

2.3 库代码链接方式

1.静态链接:将库代码链接到可执行文件中
2.动态链接:将库代码链接到可执行文件中,但是不将库代码复制到可执行文件
静态链接:可执行文件较大,但是运行速度较快
动态链接:可执行文件较小,但是运行速度较慢

2.4 交叉编译的构建系统

1.纯makefile:工具链通常由make变量CROSS_COMPILE控制
2.autotools:一组在许多开源项目中用作构建系统的工具(configure,makefile)
3.cmake构建系统

cmake关键术语

1.target:可执行文件、库文件、测试、安装包
2.properties:包括构建目标所需的源文件,编译器选项,链接库等
3.package:cmake构建系统可以生成各种类型的安装包,如deb、rpm、zip、tarball等



三.bootloader(引导加载程序)

负责启动系统和加载操作系统内核

3.1 引导顺序

3.1.1 ROM代码

复位或上电后立刻运行的代码必须存储在ROM中
ROM代码阶段结束后,SPL(辅助程序加载器)和ROM code会进入RAM中

3.1.2 SPL

SPL将TPL(第三级程序加载器)加载到DRAM中

3.1.3 TPL

TPL加载kernel image(可选加载FDT和initramfs)到DRAM中
内核运行后,bootloader会从内存中消失,内核接管系统

3.2 设备树

设备树是一种描述硬件设备的文件格式,用于描述硬件设备的属性和连接关系
设备树文件通常以.dts或.dtsi为后缀
设备树文件通常存储在/devicetree/目录下

实际操作(以飞腾派为例):

查看完整设备树结构,将/proc/device-tree/反编译为dts文件

$ sudo dtc -I fs /proc/device-tree -o current.dts

dtc:设备树编译器

以下为部分内容:

/dts-v1/;

/ {
        #address-cells = <0x02>;
        model = "Phytium Pi Board";
        #size-cells = <0x02>;
        interrupt-parent = <0x01>;
        compatible = "phytium,pe2204";

        interrupt-controller@30800000 {
                #address-cells = <0x02>;
                interrupts = <0x01 0x09 0x08>;
                #size-cells = <0x02>;
                compatible = "arm,gic-v3";
                ranges;
                #interrupt-cells = <0x03>;
                reg = <0x00 0x30800000 0x00 0x20000 0x00 0x30880000 0x00 0x80000 0x00 0x30840000 0x00 0x10000 0x00 0x30850000 0x00 0x10000 0x00 0x30860000 0x00 0x10000>;
                phandle = <0x01>;
                interrupt-controller;

                gic-its@30820000 {
                        msi-controller;
                        compatible = "arm,gic-v3-its";
                        reg = <0x00 0x30820000 0x00 0x20000>;
                        phandle = <0x10>;
                };
        };

        memory@0 {
                device_type = "memory";
                reg = <0x00 0x80000000 0x00 0x7b000000>;
        };

        memory@01 {
                device_type = "memory";
                reg = <0x20 0x00 0x01 0x80000000>;
                numa-node-id = <0x00>;
        };

#address-cells/#size-cells​​:定义子节点 reg 属性的地址和长度格式
reg​​:寄存器地址和大小,格式为 <地址高位 地址低位 大小高位 大小低位>
phandle​​:节点引用标识,用于其他节点引用(如 interrupt-parent = <0x01>)
device_type​​:设备类型,如 memory 表示内存
numa-node-id​​:节点所在的 NUMA 节点编号(如果支持)
compatible​​:设备兼容性标识,用于匹配驱动程序
interrupts​​:中断号和属性,格式为 <中断号 中断属性>

编译设备树的命令

$ dtc current.dts -o current.dtb
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐