ARM TZの学習と実験(1)

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

結局のところ、楽しんでください…

おすすめ

転載: blog.csdn.net/weixin_47139576/article/details/131739927