Yocto linux kernel, Kernel module

markyang92·2021년 9월 14일
0

yocto

목록 보기
30/53
post-thumbnail

Kernel

  • 커널 Development에서 필요한 것은
    • kernel source
    • kernel config (.config)
    • patches
  • Yocto 에서는 recipes-kernel로, 커널에 대한 레시피가 제공된다.
  • yocto release마다, Yocto Linux kernel set(linux-yocto) 를 가지고 있다.
    • 각 yocto release는 H/W support하는 Board range의 리눅스 커널 2, 3개 버전을 포함한다.
      • e.g, Yocto 3.0 LTS Kernel version: linux-yocto_4.19
      • dunfell: linux-yocto_5.4.bb

STAGING_KERNEL_DIR


커널 레시피 (meta)

  • 커널 레시피recipes-kernel/linux 내에 작성된다.
  • poky/meta/recipes-kernel/linux

  1. linux-dummy.bb에서 PROVIDES += "virtual/kernel"
  2. bitbake 명령으로 $ bitbake virtual/kernel하면 bitbake build된다.

custom image에 kernel 명시

  • poky/meta-mylayer/recipes-example/images/core-image-minimal-tiny.bb
  1. cumstom my image인 core-image-minimal-tiny.bb
PREFERRED_PROVIDER_virtual/kernel="linux-yocto" 명시

  1. $ bitbake -e [my image] | egrep "^PREFERRED_PROVIDER_" 로 잘 먹혔는지 보자.
$ bitbake -e core-image-minimal-tiny.bb | egrep "^PREFERRED_PROVIDER_virtual/kernel"
PREFERRED_PROVIDER_virtual/kernel="linux-yocto"

  1. 'linux-yocto'의 버전은? $ bitbake -e [my image] | egrep "^PREFERRED_VERSION_linux-yocto"
$ bitbake -e core-image-minimal-tiny.bb | egrep "^PREFERRED_VERSION_linux-yocto"
PREFERRED_VERSION_linux-yocto="5.4%"

  1. 또 가령 bitbake build에서 변경하고자 한다면, ${TOPDIR}/conf/local.conf에 명시하면 특정 bitbake build에서만 적용
    e.g.,
# ======== ${TOPDIR}/conf/local.conf ========= #
PREFERRED_VERSION_linux-yocto="4.19%" # 물론 4.19% 버전이 있어야겠지만

Poky qemu kernel

  1. Poky에서 제공되는 linux-yocto 사용
  2. kernel recipe fully custom 작성

  • poky/meta/conf/machine/qemux86-64.conf
    • 여기서 PREFERRED_PROVIDER_virtual/kernel은 보이지 않는데
      여기서 찾아본다.
  • poky/meta/conf/machine/include/qemu.inc

    모든 qemu machine은 "virtual/kernel"을 기본적으로 "linux-yocto"를 사용하고 그 버전은 기본적으로 "5.4%"로 되어있음
    즉, qemu를 MACHINE으로 쓰는 이미지도 해당 변수를 사용함

meta-raspberrypi/kernel

$ git cone https://git.yoctoproject.org/git/meta-raspberrypi
(poky/meta-raspberrypi) $ git checkout dunfell # poky dunfell 버전 사용하므로

  • My build인 ${TOPDIR}/conf/bblayers.conf 에 추가

  • layer 추가 확인
$ bitbake-layers show-layers
layer                 path                                      priority
==========================================================================
meta                  /home/dhyang/poky/meta                    5
meta-poky             /home/dhyang/poky/meta-poky               5
meta-yocto-bsp        /home/dhyang/poky/meta-yocto-bsp          5
meta-mylayer          /home/dhyang/poky/meta-mylayer            6
meta-raspberrypi      /home/dhyang/poky/meta-raspberrypi        9

raspberrypi의 machine

  • 위치 poky/meta-raspberrypi/conf/machine
  • MACHINE別 conf 파일들

  • 그 중 'raspberrypi.conf' 파일을 보면,
    include conf/machine/include/rpi-base.inc 라고 있음

  • poky/meta-raspberrypi/conf/machine/include/rpi-base.inc 파일을 보면
    아마 rpi-default-providers.inc에서 PROVIDES를 제공하는 듯 하다.

  • poky/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc

    meta-raspberrypi 에서 PREFERRED_PROVIDER_virtual/kernel ?= "linux-raspberrypi" PROVIDERS를 가진다.

raspberrypi의 kernel recipe

  • 위치 poky/meta-raspberrypi/recipes-kernel/linux 에 가보면 진짜 "linux-yocto"가 아닌,
    custom kernel recipe인 "linux-raspberrypi"가 있다.

Custom 'kernel' recipe

  • Custom kernel recipe를 작성하기 위해서는 아래와 같은 것들이 필요하다.
  1. set SRC_URI
  2. 필요한 patches 명시
  3. S 변수 지정
  4. defconfig 파일 제공
  5. inherit kernel.bbclass

kernel.bbclass

  • kernel class는 Linux kernel의 빌드를 다룬다.
  • kernel class는 모든 커널 트리를 빌드하는 코드를 포함하고 있다.
  • meta 레이어의 classes에서 kernel관련 bbclass

linux-dhyang_1.0.bb : 커널 레시피 작성

  • 커널 레시피recipes-kernel/linux 내에 작성된다.
    • 그래서 meta 레이어 내, recipes-kernel/linux/linux-dhyang_1.0.bb 작성
  • SRC_URI로 받아올 커널 소스는.. kernel.org에서 최신 링크를 복사하자.
  • linux-dhyang_1.0.bb

$ bitbake linux-dhyang

  • PREFERRED_PROVIDER_virtual/kernel 설정이 되어 있지 않다.
    • local.conf 에 써넣자.
      # === local.conf === #
      PREFERRED_PROVIDER_virtual/kernel = "linux-dhyang"

$ bitbake linux-dhyang

  • checksum error

  • linux-dhyang_1.0.bb 에, checksum을 넣자.

ERROR: oldnoconfig

다시 bitbake!

$ bitbake linux-dhyang
  • meta 레이어/classes/kernel.bbclass에, do_configure() 가 아래 처럼 정의 되어 있다.

'${S}'에, .config 파일이 필요한데, 커널 소스만 있어서 문제가 생긴 것이다.

  • 아예, Kernel Source를 다운 받는다.
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.6.tar.xz
$ tar -Jxvf ./linux-5.19.6.tar.xz -C ./

+)
qemux86-64 not provided defconfig


  • rpi4-64 용 toolchain을 PATH에 명시한다.

  • 커널 디렉토리로 가서, menuconfig를 실행해, .config를 만들어낸다.



~/workspace/poky/meta-raspberrypi/recipes-kernel/linux/files

-> defconfig 로 고친다.


kernel module build

  • 커널 모듈또한, recipes-kernel에 있다.
    • meta-skeleton에서, hello-mod 커널 모듈 레시피의 예가 있다.

hello-mod

  • hello-mod_0.1.bb
    • RPROVIDES_${PN}+= "kernel-module-hello"
    • inherit module 하는 모듈 패키지들은 'kernel-module-' 이라는 prefix가 반드시 필요로한다.

files/hello.c


bitbake build

$ bitbake hello-mod

KERNEL_SRC_PATH

$ bitbake hello-mod -e | grep "^KERNEL_SRC_PATH"


WORKDIR


${D}/lib/modules/<kernel>/extra/hello.ko


MACHINE_ESSENTIAL_EXTRA_RDEPENDS

  • machine-specific required 패키지이미지 빌드의 한 부분으로서 빌드된다.
    • MACHINE_ESSENTIAL 변수로 인해, 이러한 패키지는 머신의 부팅하기 위한 ESSENTIAL 이다.
    • 이 변수는 packagegroup-core-boot에 기반한 이미지에 영향을 준다. (core-image-minimal도 해당 패키지 그룹을 include 하므로 영향을 받는다.)
    • machine이 example-init을 이용해 부팅 시, HW를 초기화한다고 가정하자.
      이 경우, 아래의 내용을 MACHINE.conf에 추가할 수 있다.
      MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "example-init"
  • 커널 모듈rootfs에 추가하고 싶은 경우, 아래의 MACHINE configrootfsdependency를 씌운다.
    • MACHINE_ESSENTIAL_EXTRA_RDEPENDS : build will fail if they can't be found
    • MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS : build will not fail if they can't be found
  • 아래의 MACHINE config는 boot essential로 추가되지는 않는다.
    • MACHINE_EXTRA_RDEPENDS : build will fail if they can't be found
    • MACHINE_EXTRA_RRECOMMENDS : build will not fail if they can't be found
  • e.g., MACHINE_EXTRA_RRECOMMENDS += "kernel-module-mymodule"


packagegroup-core-boot.bb

  • meta/recipes-core/packagegroup/packagegroup-core-boot.bb

hello.ko 탑재

$ runqemu qemux86-64 core-image-minimal slirp nographic
$ insmod /lib/modules/5.4.209-yocto-standard/extra/hello.ko

KERNEL_MODULE_AUTOLOAD 변수

  • KERNEL_MODULE_AUTOLOAD 변수는 부트 때, 자동으로 로드된다.
    KERNEL_MODULE_AUTOLOAD += "module_name1 module_name2 .. "
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글