qemuエミュレーターのARM for Linux

エミュレートされたVersatilePBデバイスの画面に何かを表示するのはそれほど簡単ではありません。 執筆時点で見つかったARM用の単純なカーネルの例はすべて、シリアルポートでの作業に限定されています。



この投稿は、エミュレートされたデバイスを画面に表示するための単純なカーネルの構築方法に関するシリーズの始まりです。



2,000行の小さなコードの例を使用して、Linuxで使用されるメモリ初期化、メモリゾーン、およびスラブアロケータについて詳しく説明します。









ARMアーキテクチャ用のカーネルアセンブリ(例としてlinux-2.6.32.3を使用)




以下のコマンドは* .cmdファイルからのものです。 これらのファイルはカーネルビルドシステムによって自動的に生成されますが、コマンドを直接使用することを禁止する人はいません。



qemu ./arch/arm/boot/zImageで起動されたカーネル 、コンパイルされた解凍コードから不要なセクションを切り離すことによって取得されます。



arm-unknown-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage
      
      







このコードは、ライブラリ(libgcc.a)、エントリポイントを含むファイル( head.o )、パックされたカーネルのバイナリデータを含むファイル( piggy.o )、およびアンパックを実行するCコード( misc.o )から収集されます。



 /opt/arm/bin/arm-unknown-linux-gnueabi-ld -EL --defsym zreladdr=0x00008000 --defsym initrd_phys=0x00800000 --defsym params_phys=0x00000100 -p --no-undefined -X /opt/arm/bin/../lib/gcc/arm-unknown-linux-gnueabi/4.4.1/libgcc.a -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux
      
      







パックされたカーネルは、 piggy.Sに次の行で追加されます。



 .incbin "arch/arm/boot/compressed/piggy.gz"
      
      







piggy.oは次のコマンドでコンパイルされます。



 /opt/arm/bin/arm-unknown-linux-gnueabi-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.od -nostdinc -isystem /opt/arm/bin/../lib/gcc/arm-unknown-linux-gnueabi/4.4.1/include -Iinclude -I/home/tlx/linux-2.6.32.3_e/arch/arm/include -include include/linux/autoconf.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-versatile/include -D__ASSEMBLY__ -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -include asm/unified.h -msoft-float -Wa,-march=all -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S
      
      







piggy.gzファイル次のコマンドで取得されます。



 cat arch/arm/boot/compressed/../Image | gzip -f -9 > arch/arm/boot/compressed/piggy.gz
      
      







圧縮ディレクトリと画像ディレクトリの間の2つのポイントに注意してください。 ファイルシステムツリーで1レベル上に移動することを意味します。 イメージarch / arm / boot /にあります。

このような困難は、ビルドコマンドの自動生成によるものです。



イメージは 、コンパイルされたカーネルから不要なセクションを切り取って取得されます。



 /opt/arm/bin/arm-unknown-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm/boot/Image
      
      







パッケージ化されていないカーネル( vmlinux )は次のように取得されます。



 /opt/arm/bin/arm-unknown-linux-gnueabi-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-versatile/built-in.o arch/arm/nwfpe/built-in.o arch/arm/vfp/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o firmware/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o
      
      







最後に、見ていくmain.cファイルはinit / built-in.oの一部です。



 arm-unknown-linux-gnueabi-ld -EL -r -o init/built-in.o init/main.o init/version.o init/mounts.o init/initramfs.o init/calibrate.o
      
      







カーネルソースツリーから必要なコードを分離する作業を完了した後、次のコマンドシーケンスが取得されました。これにより、ARMアーキテクチャエミュレータのディスプレイに情報を表示できる最小限のカーネルを組み立てることができます。



 ~user/arm-2011.09/bin/arm-none-linux-gnueabi-gcc -nostdinc -mlittle-endian -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -DTEXT_OFFSET=0x00008000 -c -o arch/arm/kernel/head.o arch/arm/kernel/head.S ~user/arm-2011.09/bin/arm-none-linux-gnueabi-gcc -nostdinc -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -marm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -c -o init/main.o init/main.c ~user/arm-2011.09/bin/arm-none-linux-gnueabi-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/main.o --start-group --end-group ~user/arm-2011.09/bin/arm-none-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm/boot/Image cat arch/arm/boot/compressed/../Image | gzip -f -9 > arch/arm/boot/compressed/piggy.gz ~user/arm-2011.09/bin/arm-none-linux-gnueabi-gcc -nostdinc -mlittle-endian -mabi=apcs-gnu -mno-thumb-interwork -march=armv5te -mtune=arm9tdmi -msoft-float -march=armv5te -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S ~user/arm-2011.09/bin/arm-none-linux-gnueabi-gcc -nostdinc -D__KERNEL__ -mlittle-endian -D__ASSEMBLY__ -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -c -o arch/arm/boot/compressed/head.o arch/arm/boot/compressed/head.S ~user/arm-2011.09/bin/arm-none-linux-gnueabi-gcc -nostdinc -D__KERNEL__ -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -marm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -fpic -fno-builtin -Dstatic= -c -o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/misc.c ~user/arm-2011.09/bin/arm-none-linux-gnueabi-ld -EL --defsym zreladdr=0x00008000 --defsym initrd_phys=0x00800000 --defsym params_phys=0x00000100 -p --no-undefined -X -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux ~user/arm-2011.09/bin/arm-none-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S arch/arm/boot/compressed/vmlinux zImage
      
      







〜user / arm-2011.09 / bin / -作成者のホームディレクトリからツールチェーンを含むディレクトリへのパス。 ARMのツールチェーンをホームディレクトリにコピーし、 「ユーザー」をユーザー名に変更すると、成功するはずです。



コマンドは、実行可能なmakeファイルに結合されます(同じ名前のユーティリティと混同しないでください)。



カーネルソースのツリーから分離した直後のコード。次の投稿arm_qemu_maxで説明するすべてのものを含みます。



メモリとスラブアロケータ(画面への出力のみ) arm_qemu_minを初期化しない短縮バージョン。



残りの記事のテキストが書き込まれます。 公開するだけです。






All Articles