1。概要
linaro 公式サイトで非常に優れた git を見つけました。コード量はそれほど多くありませんが、学習用の良いユースケースです。学習プロセスを以下に記録します。
2. コードのダウンロード
リンク:コードリンク
https://git.linaro.org/virtualization/qemu-tztest.git/
3. コンパイルして実行する
3.1 関連ツールのインストール
sudo apt-get install qemu-system-aarch64
3.2 構成
ソース コード ディレクトリで実行します。
./configure --arch=aarch64
aarch64.mkを自動生成する
CFLAGS += -DFORMAT="elf64-littleaarch64" -mcmodel=large
CFLAGS += -DARCH="aarch64"
CFLAGS += -DAARCH64
3.3 コンパイル
ソースコードディレクトリでmakeを実行する
3.4 ラン
次の内容をルート ディレクトリの Makefile に追加します (コピーする場合は「+」記号を削除します)。
diff --git a/Makefile b/Makefile
index dbdc10a..f5e63aa 100644
--- a/Makefile
+++ b/Makefile
@@ -31,7 +31,7 @@ CFLAGS += -I$(ARCH) -I../common/$(ARCH) -I../common
CFLAGS += $(call cc-option, -fomit-frame-pointer, "")
CFLAGS += $(call cc-option, -fno-stack-protector, "")
CFLAGS += $(call cc-option, -fno-stack-protector-all, "")
-
+CFLAGS += -DDEBUG
export CFLAGS
BIOS_IMAGE = tztest.img
@@ -71,6 +71,11 @@ $(EL0_S_IMAGE):
$(EL0_NS_IMAGE):
$(MAKE) -C el0/nonsecure all
+run:
+ qemu-system-aarch64 -bios tztest.img -machine virt,secure=on -cpu cortex-a57 -serial stdio
+
clean:
$(MAKE) -C libcflat clean
$(MAKE) -C el3 clean
埋め込む:
make run
次のようにログを実行します。
qemu-system-aarch64 -bios tztest.img -machine virt,secure=on -cpu cortex-a57 -serial stdio
VNC server running on 127.0.0.1:5900
#EL3 started...350377984
rambase:40000000, ptbase:40040000
[DEBUG] mem_unmap_va (secure): unmapped PTE 0x40043000 (VA:0x0, PA:0x0)
[DEBUG] mem_map_pa (secure): mapped VA:0x40055000 to PA:0x40055000 - PTE:0x400512a8 (0x40055443)
[DEBUG] mem_map_pa (secure): mapped VA:0xf001000000 to PA:0x40054000 - PTE:0x40055000 (0x40054443)
[DEBUG] mem_map_pa (secure): mapped VA:0xf001001000 to PA:0x40056000 - PTE:0x40055008 (0x40056443)EL1 (�e) started...
[DEBUG] mem_unmap_va (secure): unmapped PTE 0x41043080 (VA:0x10000, PA:0x10000)
[DEBUG] mem_map_pa (secure): mapped VA:0x41058000 to PA:0x41058000 - PTE:0x410552c0 (0x41058443)
[DEBUG] mem_map_pa (secure): mapped VA:0xc001000000 to PA:0x41057000 - PTE:0x41058000 (0x41057443)
[DEBUG] mem_map_pa (secure): mapped VA:0xc001000000 to PA:0x40054000 - PTE:0x41058000 (0x40054443)
[DEBUG] mem_map_pa (secure): mapped VA:0x41059000 to PA:0x41059000 - PTE:0x410552c8 (0x41059443)
[DEBUG] mem_map_pa (secure): mapped VA:0x4105a000 to PA:0x4105a000 - PTE:0x410552d0 (0x4105a443)
[DEBUG] mem_map_pa (secure): mapped VA:0xf001001000 to PA:0x40056000 - PTE:0x4105a008 (0x40056443)
[DEBUG] mem_map_pa (secure): mapped VA:0x50000 to PA:0x50000 - PTE:0x41043280 (0x50443)
[DEBUG] el1_load_el0 (secure): Loading aarch64 EL0 test image...
[DEBUG] mem_map_pa (secure): mapped VA:0x51000 to PA:0x51000 - PTE:0x41043288 (0x51443)
[DEBUG] mem_map_pa (secure): mapped VA:0x52000 to PA:0x52000 - PTE:0x41043290 (0x52443)
[DEBUG] mem_map_pa (secure): mapped VA:0x53000 to PA:0x53000 - PTE:0x41043298 (0x53443)
[DEBUG] mem_map_pa (secure): mapped VA:0x54000 to PA:0x54000 - PTE:0x410432a0 (0x54443)
[DEBUG] mem_map_pa (secure): mapped VA:0x55000 to PA:0x55000 - PTE:0x410432a8 (0x55443)
[DEBUG] mem_map_pa (secure): mapped VA:0x56000 to PA:0x56000 - PTE:0x410432b0 (0x56443)
[DEBUG] mem_map_pa (secure): mapped VA:0x57000 to PA:0x57000 - PTE:0x410432b8 (0x57443)
[DEBUG] mem_map_pa (secure): mapped VA:0x58000 to PA:0x58000 - PTE:0x410432c0 (0x58443)
[DEBUG] mem_map_pa (secure): mapped VA:0x59000 to PA:0x59000 - PTE:0x410432c8 (0x59443)
[DEBUG] mem_map_pa (secure): mapped VA:0x5a000 to PA:0x5a000 - PTE:0x410432d0 (0x5a443)
4. コードのコンパイル
4.1 ルートディレクトリのメイクファイル
# 定义目标对象
BIOS_IMAGE = tztest.img
LIBCFLAT = libcflat.a
EL3_IMAGE = el3/el3.bin
EL1_S_IMAGE = el1/secure/el1_sec.bin
EL1_NS_IMAGE = el1/nonsecure/el1_nsec.bin
EL0_S_IMAGE = el0/secure/el0_sec.elf
EL0_NS_IMAGE = el0/nonsecure/el0_nsec.elf
# tztest.img编译与依赖,将el3.bin el1_sec.bin等文件打包成tztest.img文件
$(BIOS_IMAGE): $(LIBCFLAT) $(EL3_IMAGE) $(EL1_S_IMAGE) $(EL1_NS_IMAGE) \
$(EL0_S_IMAGE) $(EL0_NS_IMAGE)
dd if=$(EL3_IMAGE) of=$@ 2> /dev/null
dd oflag=seek_bytes seek=65536 if=$(EL1_S_IMAGE) of=$@ 2> /dev/null
dd oflag=seek_bytes seek=131072 if=$(EL1_NS_IMAGE) of=$@ 2> /dev/null
dd oflag=seek_bytes seek=196608 if=$(EL0_NS_IMAGE) of=$@ 2> /dev/null
dd oflag=seek_bytes seek=327680 if=$(EL0_S_IMAGE) of=$@ 2> /dev/null
chmod +x $(BIOS_IMAGE)
# 编译一个轻量级的libc
$(LIBCFLAT):
$(MAKE) -C libcflat all
# 编译el3的image
$(EL3_IMAGE):
$(MAKE) -C el3 all
# 编译secure el1的image
$(EL1_S_IMAGE):
$(MAKE) -C el1/secure all
# 编译non secure el1的镜像
$(EL1_NS_IMAGE):
$(MAKE) -C el1/nonsecure all
# 编译secure el0的镜像
$(EL0_S_IMAGE):
$(MAKE) -C el0/secure all
# 编译non seucre el0的镜像
$(EL0_NS_IMAGE):
$(MAKE) -C el0/nonsecure all
4.1.1 シェルでの dd コマンド
dd if=$(EL3_IMAGE) of=$@ 2> /dev/null
2> /dev/null是将错误信息重定向,不输出,遇到报错,不在终端上输出错误信息
dd: 指定したサイズのブロック単位でファイルをコピーし、コピー中に指定した変換を実行します。
- if=filename: 入力ファイル名、デフォルトは標準入力です。つまり、ソースファイルを指定します。<if=入力ファイル>
- of=filename: 出力ファイル名、デフォルトは標準出力です。つまり、宛先ファイルを指定します。<of=出力ファイル>
- ibs=bytes: 一度に bytes バイトを読み取ります。つまり、bytes バイトのブロック サイズを指定します。
obs=bytes: 一度に bytes バイトを出力します。つまり、bytes バイトのブロック サイズを指定します。
bs=bytes: 同時に、読み取り/出力のブロック サイズを bytes バイトに設定します。 - cbs=bytes: 一度に bytes バイトずつ変換します。つまり、変換バッファ サイズを指定します。
- Skip=blocks: コピーを開始する前に、入力ファイルの先頭からブロック数をスキップします。
- Seek=blocks: コピーを開始する前に、出力ファイルの先頭からブロック数をスキップします。
4.2 el3/Makefile
これにより、次のように Makefile の VPATH が記録されます。
VPATH = $(ARCH):../common/$(ARCH):../common:../tztest/el3:../tztest
これは、次のように、ディレクトリ名を追加しなくても、これらのディレクトリにある .c や .S などのソース ファイルが自動的に検索されることを意味します。
EL3_OBJS = el3_init.o \
el3_exception.o \
el3.o \
el3_monitor_asm.o \
mem_util.o \
builtins.o \
tztest.o \
tztest_el3.o
tztest_el3.c ファイルは ./tztest/el3/tztest_el3.c パスにあります。VPATH パスを追加した後は、フォルダ名を obj に追加する必要はありません。コンパイラはこれらの下でソース コードを自動的に検索します。ディレクトリ。
5. 印刷ログをアセンブリに追加します
仮想プラットフォームの UART アドレス:
#define UART0_BASE 0x09000000
以下の方法でLOGを印刷します
ldr x0, =0x09000000
ldr x1, =35 //printf "#"
str x1, [x0]
str x1, [x0]
str x1, [x0]
str x1, [x0]
str x1, [x0]
ログは次のように出力されます。
##### 多くの場所で、すべて私たちが出力します (コンパイル時に make clean && make && make を実行することを忘れないでください。有効にするには、Makefile が適切に記述されていないため、インクリメンタル コンパイルが発生します)。ルートディレクトリは有効になりません)
qemu-system-aarch64 -bios tztest.img -machine virt,secure=on -cpu cortex-a57 -serial stdio
VNC server running on 127.0.0.1:5900
#####EL3 started...23025664
結局のところ、楽しんでください…