0%

Linux-Lab9-Kernel Development on ARM

Kernel Development on ARM

实验目标:

  • 了解片上系统 System on a Chip(SoC)的含义
  • 熟悉使用 ARM 作为受支持架构的嵌入式世界
  • 了解主板支持包的含义(BSP)
  • 以 i.MX6UL 平台为例,使用 Qemu 编译和引导 ARM 内核
  • 使用设备树熟悉硬件描述

片上系统 System on a Chip 是将整个系统集成到其上的集成电路(IC)

通常在 SoC 上可以找到的组件包括中央处理单元(CPU)、内存、输入/输出端口、存储设备以及更复杂的模块,如音频数字接口、神经处理单元(NPU)或图形处理单元(GPU)

SoC 可用于各种最常见的应用,包括:

  • 消费类电子产品(电视机、手机、视频游戏机)
  • 工业计算机(医学成像等)
  • 汽车
  • 家电

对于 SoCs,最好使用 ARM 架构,使用的标准指令集架构是 RISC-V(精简指令集计算机,Reduced Instruction Set Computer-RISC)

ARM 平台的简化视图如下图所示:

  • 一或者多个 CPU
  • 一个系统总线
  • 时钟和复位模块(PLL,OSC,复位控制器)
  • 中断控制器
  • 定时器
  • 内存控制器
  • 外设控制器

以下是 i.MX6UL 平台的完整框图:

Board Support package

Board Support Package(BSP)是允许演示特定硬件平台功能的最小软件包集:

  • 工具链 Toolchain:为ARM平台生成可执行代码的交叉编译器
1
2
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf # for arm32
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu # for arm64
  • BootLoader 引导加载程序
  • Linux 内核映像、设备树文件和驱动程序
  • Rootfs 根文件系统

Device tree

设备树 DT 是用于描述系统中硬件设备的树结构,树中的每个节点描述一个设备,因此称为设备节点,引入 DT 是为了提供一种发现 “non-discoverable 不可发现” 的硬件的方法

设备树存储在设备树源(.dts)中,并编译为设备树 blob(.dtb)

  • 一个节点可能包含以该格式排列的多个属性,名称是一个字符串,值可以是字节,字符串,字符串数组
  • 下面是一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/ {
node@0 {
empty-property;
string-property = "string value";
string-list-property = "string value 1", "string value 2";
int-list-property = <value1 value2>;

child-node@0 {
child-empty-property;
child-string-property = "string value";
child-node-reference = <&child-node1>;
};

child-node1: child-node@1 {
child-empty-property;
child-string-property = "string value";
};
};
};

Rootfs

根文件系统是挂载在文件层次结构顶部的文件系统,它至少应包含允许系统引导到 shell 的关键文件

  • 我们将使用 Yocto 根图像,为了下载一个 rootfs 映像,需要运行:
1
2
$ cd tools/labs/
$ ARCH=arm make core-image-minimal-qemuarm.ext4

Exercises

要解决练习,您需要执行以下步骤:

  • 从模板准备 skeletons
  • 构建模块
  • 将模块复制到虚拟机
  • 启动 VM 并在 VM 中测试模块
1
2
3
make clean
LABS=arm_kernel_development make skels
make build

ARM 内核编译:

1
2
3
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig
# set FSL_ASRC=n and DRM_MXSFB=n
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j8

内核模块编译:

1
2
3
4
5
6
# modules build
tools/labs $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make build
# modules copy
tools/labs $ ARCH=arm make copy
# kernel build
tools/labs $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j8

ARM 内核启动:

1
qemu-system-arm -M mcimx6ul-evk -cpu cortex-a7 -m 512M -kernel arch/arm/boot/zImage -nographic  -dtb arch/arm/boot/dts/imx6ul-14x14-evk.dtb -append "root=/dev/mmcblk0 rw console=ttymxc0 loglevel=8 earlycon printk" -sd tools/labs/core-image-minimal-qemux86.ext4