スキップしてメイン コンテンツに移動

Zephyr build (1)

qemu 実行

Zephyrのソースコードが展開されたディレクトリ(絶対パス)を、[zephyr_base]と記述する。
$ cd [zephyr_base]/samples/hello_world/microkernel
$ QEMU_BIN_PATH=/usr/local/bin make BOARD=qemu_x86 qemu
  Using [zephyr_base] as source for kernel
  GEN     ./Makefile
  CHK     include/generated/version.h
  CHK     misc/generated/configs.c
  CHK     include/generated/offsets.h
  CHK     misc/generated/sysgen/prj.mdef
  UPD     misc/generated/sysgen/prj.mdef
  CC      kernel/microkernel/k_task.o
  CC      kernel/microkernel/k_idle.o
  CC      kernel/microkernel/k_init.o
  CC      kernel/microkernel/k_command_packet.o
  CC      kernel/microkernel/k_move_data.o
  CC      kernel/microkernel/k_ticker.o
  CC      kernel/microkernel/k_memory_map.o
  CC      kernel/microkernel/k_memory_pool.o
  CC      kernel/microkernel/k_nop.o
  CC      kernel/microkernel/k_offload.o
  CC      kernel/microkernel/k_event.o
  CC      kernel/microkernel/k_mailbox.o
  CC      kernel/microkernel/k_mutex.o
  CC      kernel/microkernel/k_fifo.o
  CC      kernel/microkernel/k_semaphore.o
  CC      kernel/microkernel/k_timer.o
  CC      kernel/microkernel/k_pipe_buffer.o
  CC      kernel/microkernel/k_pipe.o
  CC      kernel/microkernel/k_pipe_get.o
  CC      kernel/microkernel/k_pipe_put.o
  CC      kernel/microkernel/k_pipe_util.o
  CC      kernel/microkernel/k_pipe_xfer.o
  CC      kernel/microkernel/k_nano.o
  CC      kernel/microkernel/k_server.o
  LD      kernel/microkernel/built-in.o
  LD      kernel/built-in.o
  CC      misc/generated/sysgen/kernel_main.o
  LD      misc/generated/sysgen/built-in.o
  LD      misc/generated/built-in.o
  LD      misc/built-in.o
  CC      arch/x86/core/i386_sysV_abi/thread.o
  LD      arch/x86/core/i386_sysV_abi/built-in.o
  CC      arch/x86/core/cpuhalt.o
  CC      arch/x86/core/msr.o
  CC      arch/x86/core/strtask.o
  LD      arch/x86/core/built-in.o
  LD      arch/x86/built-in.o
  LD      arch/built-in.o
  CC      samples/hello_world/microkernel/src/main.o
  LD      samples/hello_world/microkernel/src/built-in.o
  LINK    zephyr.lnk
  SIDT    staticIdt.o
  LINK    zephyr.elf
  BIN     zephyr.bin
To exit from QEMU enter: 'CTRL+a, x'
[QEMU] CPU: qemu32
qemu-system-i386: warning: Unknown firmware file in legacy mode: genroms/multiboot.bin

Hello World!

Makefileをたどる

カレントディレクトリは、[zephyr_base]/samples/hello_world/microkernel/。
ここで make コマンドを実行すると、[zephyr_base]/samples/hello_world/microkernel/Makefile を呼び出す。
[zephyr_base]/samples/hello_world/microkernel/Makefile
(省略)
include ${ZEPHYR_BASE}/Makefile.inc

qemu ターゲット

[zephyr_base]/Makefile.inc
qemu: $(DOTCONFIG)
        $(Q)$(call zephyrmake,$(O),$@)
[zephyr_base]/Makefile.inc
zephyrmake = @+$(MAKE) -C $(ZEPHYR_BASE)  O=$(1) \
          PROJECT=$(PROJECT_BASE) SOURCE_DIR=$(SOURCE_DIR) $(2)
下記が実行される。
make -C [zephyr_base] O=[zephyr_base]samples/hello_world/microkernel/outdir PROJCT=[zephyr_base]samples/hello_world/microkernel SOURCE_DIR=[zephyr_base]/samples/hello_world/microkernel qemu
↑は、[zephyr_base]/Makefileのqemuターゲットを実行する。

qemu ターゲット

[zephyr_base]/Makefile
qemu: zephyr
        $(Q)$(QEMU) $(QEMU_FLAGS) $(QEMU_EXTRA_FLAGS) -kernel $(KERNEL_ELF_NAME)
下記が実行される。
/usr/local/bin/qemu-system-i386 -m 32 -cpu qemu32 -no-reboot -nographic -vga none -display none -net none -clock dynticks -no-acpi -balloon none -L /usr/share/qemu -bios bios.bin -machine type=pc-0.14 -pidfile qemu.pid -serial mon:stdio  -kernel zephyr.elf
$(QEMU)
[zephyr_base]/Makefile
QEMU_BIN_PATH ?= /usr/bin
QEMU  = $(QEMU_BIN_PATH)/$(QEMU_$(ARCH))
今回は、実行時に QEMU_BIN_PATH=/usr/local/bin として、QEMU_BIN_PATH を指定している。
$(QEMU_FLAGS)
[zephyr_base]/arch/x86/Makefile
QEMU_BIOS ?= /usr/share/qemu
QEMU_CPU_TYPE_x86 = qemu32
QEMU_X86_NO_REBOOT_y =
QEMU_X86_NO_REBOOT_  = -no-reboot
QEMU_FLAGS_x86 = -m 32 -cpu $(QEMU_CPU_TYPE_x86) \
        $(QEMU_X86_NO_REBOOT_$(CONFIG_REBOOT)) \
        -nographic -vga none -display none -net none \
        -clock dynticks -no-acpi -balloon none \
        -L $(QEMU_BIOS) -bios bios.bin \
        -machine type=pc-0.14
QEMU_x86 = qemu-system-i386

コメント

このブログの人気の投稿

Initial run-length encoding@bzip2を読んでみた

Wikipediaのbzip2圧縮アルゴリズムの一部を読んだので意訳して紹介します。 参考にしたソースコードは bzip2-1.0.6 です。 Wikipedia https://en.wikipedia.org/wiki/Bzip2#Initial_run-length_encoding bzip2 ソースコード https://github.com/junkawa/bzip2/tree/master/bzip2-1.0.6 概要 bzip2では、入力データを読み込んだ時( copy_input_until_stop()@bzlib.c → ADD_CHAR_TO_BLOCK() → add_pair_to_block() ) に ランレングス符号化 を行う。 Wikipedia Any sequence of 4 to 255 consecutive duplicate symbols is replaced by the first four symbols and a repeat length between 0 and 251.   4〜255回、同じシンボルが連続した場合、「最初の4シンボル+残りの繰り返し回数」に置き換わる。 Thus the sequence "AAAAAAABBBBCCCD" is replaced with "AAAA\3BBBB\0CCCD", where "\3" and "\0" represent byte values 3 and 0 respectively.  "AAAAAAABBBBCCCD"は、"AAAA\3BBBB\0CCCD"に置き換わる。 AAAAAAA (Aが7回)は、最初の4シンボル(AAAA) + 残りの繰り返し回数(3)となる。 BBBB (Bが4回)は、最初の4シンボル(BBBB) + 残りの繰り返し回数(0)となる。 C,Dは連続回数が4回に達しないのでそのままとなる。 ここでは分かりやすさのため、A,B,Cというシンボルを使っているが、実際のbzip2では1シンボルは1バイト(0〜255の値)。 したがって、シンボル7...

Zephyr build (6)

この記事で関係するターゲット 前の記事 参照 zephyr.lnk [zephyr_base]/Makefile -nostartfiles -nodefaultlibs -nostdlib -static -Wl,-X -Wl,-N -Wl,--gc-sections -Wl,--build-id=none -Wl,-Map=[zephyr_base]/samples/hello_world/microkernel/outdir/zephyr.map -L ./include/generated -u _OffsetAbsSyms -u _ConfigAbsSyms -e __start -Wl,--start-group -Wl,--whole-archive -Wl,--no-whole-archive drivers/built-in.o ./samples/hello_world/microkernel/src/built-in.o lib/built-in.o kernel/built-in.o misc/built-in.o net/built-in.o boards/built-in.o arch/built-in.o ext/built-in.o ./arch/x86/core/offsets/offsets.o -Wl,--end-group -L /Volumes/CrossToolNG/x-tools/i586-pc-elf/lib/gcc/i586-pc-elf/5.2.0/ -lgcc -nostartfiles 3.14 Options for Linking Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. スタートアップファイル(crt*.oなど)をリンクしない。 -nodefaultlibs 3.14 Options for Linking Do not use the standard system ...

Zephyr build (7)

この記事で関係するターゲット linker.cmd ターゲット [zephyr_base]/Makefile linker.cmd: $(zephyr-deps) $(Q)$(CC) -x assembler-with-cpp -nostdinc -undef -E -P \ $(LDFLAG_LINKERCMD) $(LD_TOOLCHAIN) -I$(srctree)/include \ -I$(objtree)/include/generated $(EXTRA_LINKER_CMD_OPT) $(KBUILD_LDS) -o $@ $(zephyr-deps) TODO $(Q) [zephyr_base]/Makefile ifeq ("$(origin V)", "command line") KBUILD_VERBOSE = $(V) endif ifndef KBUILD_VERBOSE KBUILD_VERBOSE = 0 endif ifeq ($(KBUILD_VERBOSE),1) quiet = Q = else quiet=quiet_ Q = @ endif ... export quiet Q KBUILD_VERBOSE make V=1 などとすると、環境変数 Q は"" となる(or 未定義?)。それ以外では、Q は @ となる。 $(Q)$(CC) が gcc となる場合、実行する gcc ... というコマンドが表示されるが、@gcc となる場合、コマンドは表示されない。 5.2 Recipe Echoing 参照。 $(CC) 前の記事 参照。 $(LDFLAG_LINKERCMD) 未定義 $(LD_TOOLCHAIN) [zephyr_base]/Makefile LD_TOOLCHAIN ?= -D__GCC_LINKER_CMD__ LD_TOOLCHAIN が未定義の場合、-D__GCC_LINKER_CMD__ とする。 $(srctree) [zephyr_base]/Makefile ifeq ($(KBUILD_...