yocto-第41篇-beaglebone-yocto.conf配置分析之kernel

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

beaglebone-yocto.conf配置分析之kernel

继续分析meta-yocto-bsp/conf/machine/beaglebone-yocto.conf配置文件的作用
在该conf文件中有如下一些linux kernel相关的一些配置:

DEFAULTTUNE ?= "cortexa8hf-neon"
include conf/machine/include/tune-cortexa8.inc
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "5.4%"
KERNEL_IMAGETYPE = "zImage"
KERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
KERNEL_EXTRA_ARGS += "LOADADDR=${UBOOT_ENTRYPOINT}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

DEFAULTTUNE变量

使用该变量来优化机器、CPU和应用程序的性能。与CPU的体系架构有关,比如这里该变量值是coretexa8hf-neon, 这个值有三部分组成coretexA8架构的处理、hf表示hard float硬浮点运算和neon(ARM架构处理器扩展结构,适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构)。

这个变量很重要,基本上交叉编译器怎么来的,与这个变量有很大的关系。

还会引用到相应的inc文件,比如这里是tune-cortexa8.inc,看下具体内容

poky]$ cat meta/conf/machine/include/tune-cortexa8.inc 
DEFAULTTUNE ?= "armv7athf-neon"  #前面已经赋值了cortexa8hf-neon,这里就无效

require conf/machine/include/arm/arch-armv7a.inc  #CortextA8代表在ARMv7架构下的Cortext-A系列,相应的配置文件在meta/conf/machine/include/arm/arch-armv7a.inc。里面有些变量被下面的变量引用到

TUNEVALID[cortexa8] = "Enable Cortex-A8 specific processor optimizations"
TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'cortexa8', ' -mcpu=cortex-a8', '', d)}" #包含cortexa8,看下面。然后gcc就会带-mcpu=cortex-a8选项。
MACHINEOVERRIDES =. "${@bb.utils.contains('TUNE_FEATURES', 'cortexa8', 'armv7a:', '' ,d)}"

# Little Endian base configs
AVAILTUNES += "cortexa8 cortexa8t cortexa8-neon cortexa8t-neon" #可选变量列表,可用的tunes,与下面的_tune-corexa8*后缀对上,因为我们的是cortexa8hf-neon,因此下面这些没有用上
ARMPKGARCH_tune-cortexa8             = "cortexa8" #下面这几个都没有用上
ARMPKGARCH_tune-cortexa8t            = "cortexa8"
ARMPKGARCH_tune-cortexa8-neon        = "cortexa8"
ARMPKGARCH_tune-cortexa8t-neon       = "cortexa8"
# mcpu is used so don't use armv7a as we don't want march
TUNE_FEATURES_tune-cortexa8             = "arm vfp cortexa8" #被下面TUNE_FEATURES_tune-cortexa8-neon引用
...
TUNE_FEATURES_tune-cortexa8-neon        = "${TUNE_FEATURES_tune-cortexa8} neon"  #这个变量被下面用了,最终就是“arm vfp cortexa8 neon”
...

# HF Tunes
AVAILTUNES += "cortexa8hf cortexa8thf cortexa8hf-neon cortexa8thf-neon" #有cortexa8hf-neon
...
ARMPKGARCH_tune-cortexa8hf-neon        = "cortexa8" #用到了
...
TUNE_FEATURES_tune-cortexa8hf-neon        = "${TUNE_FEATURES_tune-cortexa8-neon} callconvention-hard" #最终就是“arm vfp cortexa8 neon callconvention-hard”
...
PACKAGE_EXTRA_ARCHS_tune-cortexa8hf-neon        = "${PACKAGE_EXTRA_ARCHS_tune-armv7ahf-neon} cortexa8hf-vfp cortexa8hf-neon" #这里用到了arm/arch-armv7a.inc文件中的TUNE_FEATURES_tune-armv7ahf-neon        = "${TUNE_FEATURES_tune-armv7a-neon} callconvention-hard",而TUNE_FEATURES_tune-armv7a-neon的值是:"${TUNE_FEATURES_tune-armv7a} neon",又TUNE_FEATURES_tune-armv7a的值为arm armv7a vfp,因此最终的值为:arm armv7a vfp neon callconvention-hard cortexa8hf-vfp cortexa8hf-neon
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

其中

$ source oe-init-build-env
build]$ bitbake -e core-image-sato | grep TUNE_FEATURES
TUNE_FEATURES_tune-cortexa8hf-neon="arm vfp cortexa8 neon callconvention-hard"

build]$ cat tmp/deploy/images/beaglebone-yocto/core-image-sato-beaglebone-yocto.testdata.json
...
"CC": "arm-poky-linux-gnueabi-gcc  -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=tmp/work/beaglebone_yocto-poky-linux-gnueabi/core-image-sato/1.0-r0/recipe-sysroot",
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们看下x86、ARM和MIPS架构的这个变量值分别是什么:

#meta-yocto-bsp/conf/machine/genericx86.conf
DEFAULTTUNE ?= "core2-32"  #x86
require conf/machine/include/tune-core2.inc
require conf/machine/include/genericx86-common.inc

#meta-yocto-bsp/conf/machine/genericx86-64.conf
DEFAULTTUNE ?= "core2-64"  #x86-64
require conf/machine/include/tune-core2.inc
require conf/machine/include/genericx86-common.inc

#meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
DEFAULTTUNE ?= "cortexa8hf-neon"
include conf/machine/include/tune-cortexa8.inc (这里又有:require conf/machine/include/arm/arch-armv7a.inc)

require conf/machine/include/tune-mips64.inc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

require和include区别和功能

上面看到有的inc是被include有的是被require, 然而两者是类似的。都会把被包含的文件内容“插入”进调用的地方。

变量带下划线什么意思?

我们看到很多变量都带有下划线"_",然后后面是一些小写的字符串。有什么用呢?
这个呢就是可选赋值。怎么理解这个呢,看例子:

OVERRIDES = "abc:def:xyz" #列出了三个值:abc、def和xyz。
TEST = "default"  #这个是默认值,如果下面赋值条件不成功时默认就是这个
TEST_def = "123"  #这里def满足上面OVERRIDES的条件,因此TEST赋值为123
TEST_nooverride = "456" #不满足OVERRIDES的条件
  • 1
  • 2
  • 3
  • 4

OVERRIDES变量是一个以冒号字符分隔的列表,其中包含需要满足条件的项。这里只有TEST_def中的def满足OVERRIDES的条件才会覆盖TEST的默认值,即TEST=“123”。

再看一个实际的例子,在

meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.4.bbappend
  • 1

文件中有定义linux 内核的分支。因为不同的机器有不同的内核分支,可能使用了相同的bb文件,但是如果更换机器就要专门的设置分支那岂不是很麻烦?于是有了这些选项:

KBRANCH_genericx86  = "v5.4/standard/base"
KBRANCH_genericx86-64  = "v5.4/standard/base"
KBRANCH_edgerouter = "v5.4/standard/edgerouter"
KBRANCH_beaglebone-yocto = "v5.4/standard/beaglebone"
  • 1
  • 2
  • 3
  • 4

有了下划线后面的字符串我们就会根据当前的MACHINE来选择对应的分支,比如已知我们的MACHINE是beaglebone-yocto,那么相应的kernel分支就是v5.4/standard/beaglebone。是否奇怪怎么没有看到OVERRIDES变量呢?看这个:

build]$ bitbake -e core-image-sato | grep ^OVERRIDES=
OVERRIDES="linux-gnueabi:arm:pn-core-image-sato:armv7a:beaglebone-yocto:poky:class-target:libc-glibc:forcevariable"
  • 1
  • 2

上面可以看到OVERRIDES是包含beaglebone-yocto,因此选择的就是KBRANCH_beaglebone-yocto。

记住" “下划线后面是小写字符串,而且不能再出现” "下划线了。

KERNEL_IMAGETYPE变量

我记得内核镜像有几种类型,比如zImage和uImage等。这里定义的是zImage。

KERNEL_DEVICETREE变量

ERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
  • 1

生成这三个dtb文件

KERNEL_EXTRA_ARGS变量

构建系统编译内核时,通过make命令行传入的一个参数:

KERNEL_EXTRA_ARGS += "LOADADDR=${UBOOT_ENTRYPOINT}"
  • 1

MACHINE_FEATURES变量

指定机器能够支持的硬件特性列表:

MACHINE_FEATURES = "usbgadget usbhost vfat alsa"
  • 1

Distro支持的特性有:

alsa:包括alsa支持(如果可用,安装OSS兼容内核模块)。
api文档:允许在配方构建期间生成api文档。当使用bitbake-c populate_sdk命令时,生成的文档被添加到SDK tarballs中。
蓝牙:包括蓝牙支持(仅集成蓝牙)。
cramfs:包括cramfs支持。
directfb:包括directfb支持。
ext2:包括支持内置HDD/Microdrive存储文件的设备的工具(而不是只支持Flash的设备)。
ipsec:包括ipsec支持。
ipv6:包括ipv6支持。 键盘:包括键盘支持(例如,引导期间将加载keymaps)。
ldconfig:包括对ldconfig和ld.so.conf公司瞄准目标。
nfs:包括nfs客户端支持(用于在设备上装载nfs导出)。
opengl:包括开放图形库,这是一个跨语言、多平台的应用程序编程接口,用于绘制二维和三维图形。
pci:包括pci总线支持。
pcmcia:包括pcmcia/CompactFlash支持。
ppp:包括ppp拨号支持。
ptest:支持在单个配方支持的地方构建包测试。
smbfs:包括SMB网络客户端支持(用于在设备上装载Samba/Microsoft Windows共享)。
systemd:包括对这个init管理器的支持,它完全替代了init,具有并行启动服务、减少shell开销和其他特性。许多发行版都使用这个init管理器。
usbgadget:包括USB小工具设备支持(用于USB网络/串行/存储)。
usbhost:包括USB主机支持(允许连接外部键盘、鼠标、存储器、网络等)。
usrmerge:将/bin、/sbin、/lib和/lib64目录合并到/usr目录中各自对应的目录中,以提供更好的包和应用程序兼容性。
wayland:包括wayland显示服务器协议和支持该协议的库。
wifi:包括wifi支持(仅集成)。
x11:包括X服务器和库。

IMAGE_BOOT_FILES变量

IMAGE_BOOT_FILES ?= "u-boot.${UBOOT_SUFFIX} MLO zImage am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
  • 1

使用Wic工具和bootimg-partition源插件准备映像时,安装到引导分区的文件的。默认情况下,这些文件以与源文件相同的名称安装,以空格分隔的列表。大体意思就是讲这些文件用Wic工具拼接成一个大文件,方便烧录。