kernel, initramfs

markyang92·2024년 1월 27일
0

embedded_linux

목록 보기
5/7
post-thumbnail

커널 빌드

$ mkdir kernel
$ cd kernel
  • 커널 다운로드
$ wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.11.tar.xz
$ tar xvf linux-6.6.11.tar.xz
$ cd linux-6.6.11
  • 커널 defconfig
    • 이전글의 크로스빌드 설정이 되어 있어야한다.
      export PATH=$PATH:$HOME/x-tools/arm-hello-linux-uclibcgnueabihf/bin
      $ arm-linux- <-- 여기서 탭치면
      arm-linux-addr2line     arm-linux-gcc    arm-linux-gcov          ... 생략
      툴체인 바로 실행할 수 있는 환경이어야한다.
$ make ARCH=arm CROSS_COMPILE=arm-linux- vexpress_defconfig
  • arch/arm/configs/에 있는 vexpress_defconfig가 기본적인 .config를 생성한다.

  • 커널 빌드
$ make ARCH=arm CROSS_COMPILE=arm-linux-

  • dtb
    • arch/arm/boot/dts/armvexpress-v2p-ca9.dtb가 존재한다.

qemu 탑재

$ qemu-system-arm -M vexpress-a9 -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb -nographic
  • rootfs가 없기 때문에 실패한다.

initramfs

$ mkdir initramfs
$ cd initramfs
  • init.c
#include <stdio.h>

int main(){
        printf("hello world\n");
        while(1);
        return 0;
}
  • 이전글의 크로스빌드 설정이 되어 있어야한다.
    export PATH=$PATH:$HOME/x-tools/arm-hello-linux-uclibcgnueabihf/bin
    $ arm-linux- <-- 여기서 탭치면
    arm-linux-addr2line     arm-linux-gcc    arm-linux-gcov          ... 생략
    툴체인 바로 실행할 수 있는 환경이어야한다.
  • 컴파일
$ arm-linux-gcc --static init.c -o init
$ file init

  • cpio
$ echo init|cpio -o --format=newc > initramfs

qemu탑재

$ qemu-system-arm -M vexpress-a9 -kernel <kernel> \
-dtb <dtb> \
-append "console=ttyAMA0,115200" -nographic \
-initrd <initramfs>
  • -append: 커널 커맨드 추가

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글