コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2019年10月6日 >>> 2019年9月23日
link もっと後

2019年10月6日

RISC-Vのバイナリダンプを逆アセンブルする

目次: RISC-V

相変わらず空き時間にRISC-Vのエミュレータを書いています。RV64IMACくらいが必要なのですが、意外と命令の種類が多くていっぺんにやるのは面倒なので、HiFive Unleashedのファームウェアを動かしてみて、足りない命令から実装していくスタイルで開発しています。

HiFive Unleashedの電源を入れたときに真っ先に起動してくるファームウェアというかブートローダはZSBL(Zeroth Stage Boot Loader), FSBL(First Stage Boot Loader)という名前です。

なんと親切なことにソースコードが公開されていますGitHub - Freedom U540-C000 Bootloader Codeのリンク)。素晴らしいですね……。

なぜかUnleashedから引っこ抜いてきたバイナリと、手元でコンパイルしたZSBL, FSBLのバイナリが一致しません。何か間違っているのかも?ちょっと気になります。しかしながら、ソースコードが公開されている意義は非常に大きいです。

メモリマップも公開されています。SiFive Freedom U540 SoCのサイトからダウンロードできます。

Unleashedリセット〜ZSBLを例に解説

U540のマニュアルによると、リセット直後のPCは0x1004で、その後はMSELの値を見て、適切な場所に飛ぶとあります。MSELというのは、Unleashedボード上のDIPスイッチのことです。購入後、変えていなければ状態だと全部ON、つまり0xfになっていると思います。

リセット直後に実行される領域の周辺バイナリをダンプしてみましょう。ダンプには拙作のmemaccess(GitHubへのリンク)を使っています。

Unleashed 0x1000〜0x1040領域のダンプ
# ma db 0x1000 0x40
00001000  0f 00 00 00 97 02 00 00  03 a3 c2 ff 13 13 33 00
00001010  b3 82 62 00 83 a2 c2 0f  67 80 02 00 00 00 00 00
00001020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00001030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00001040

何かが書いてあるようですが、RISC-Vのバイナリがスラスラ読めるほど達人ではないので、ファイルにダンプして逆アセンブルします。

Unleashed 0x1000〜0x1040領域の逆アセンブル
$ riscv64-unknown-elf-objdump -EL -D -b binary -m riscv:rv64 --adjust-vma=0x1000 reset.bin
reset.bin:     file format binary

Disassembly of section .data:

0000000000001000 <.data>:
    1000:       0000000f                fence   unknown,unknown
    1004:       00000297                auipc   t0,0x0
    1008:       ffc2a303                lw      t1,-4(t0) # 0x1000
    100c:       00331313                slli    t1,t1,0x3
    1010:       006282b3                add     t0,t0,t1
    1014:       0fc2a283                lw      t0,252(t0)
    1018:       00028067                jr      t0
        ...

先頭が変な命令に見えますが、これは命令ではなくMSELです。値は先程も言ったとおり0xfです。実行されるのは0x1004からです。大した量でもないし、1行毎に見ていきます。

0x1004: auipc t0, 0x0
PC + 0をt0にロードします。t0: 0x1004です。
0x1008: lw t1,-4(t0) # 0x1000
レジスタt1にアドレスt0 - 4 = 0x1004 - 4 = 0x1000つまりMSELをロードします。t1: 0xfです。
0x100c: slli t1,t1,0x3
レジスタt1を3ビット左シフト(= 8倍)します。t1: 0xf << 3 = 0x78です。
0x1010: add t0,t0,t1
レジスタt0とt1を足します。t0: です。t0: 0x1004 + 0x78 = 0x107cです。
0x1014: lw t0,252(t0)
レジスタt0にt0 + 252のアドレスからロードします。アドレスは0x107c + 252 = 0x1178です。後述のとおりt0: 0x10000です。
1018: jr t0
レジスタt0のアドレスにジャンプします。すなわち0x10000にジャンプします。

参考として、アドレス0x1178に何が書いてあるか示しておきます。付近の領域0x1100〜0x1180にはMSELの値に応じたジャンプ先のアドレスが書いてあります。MSELが他の値になったらどこにジャンプするか、眺めてみると面白いかと思います。

Unleashed 0x1000〜0x1040領域のダンプ
# ma dd 0x1100 0x80
00001100  00001004 00000000  20000000 00000000
00001110  30000000 00000000  40000000 00000000
00001120  60000000 00000000  00010000 00000000
00001130  00010000 00000000  00010000 00000000
00001140  00010000 00000000  00010000 00000000
00001150  00010000 00000000  00010000 00000000
00001160  00010000 00000000  00010000 00000000
00001170  00010000 00000000  00010000 00000000    ★0x1178には0x10000が書いてある
00001180

マニュアルの言うとおり、MSELが0xfの場合、リセット後ZSBLにジャンプ、アドレスで言うと0x10000にジャンプすることが確認できました。

以降も同様に0x10000付近をダンプし、逆アセンブルしたり、エミュレータに実行させてみたりして、開発を進めています。今はZSBLは通過して、FSBLの先頭の方まで実行できるようになりました。いうなれば、砂山にトンネルを掘っているような気分でしょうか、なかなか面白いです。

通常は逆アセンブルだけだと処理の意図を掴むことが難しいですけども、その点U540はソースコードが読めるため、当たりを付けることが比較的容易です。しばらくは素敵なおもちゃになりそうなボードです。

編集者:すずき(2021/06/28 15:26)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2019年10月6日 >>> 2019年9月23日
link もっと後

管理用メニュー

link 記事を新規作成

<2019>
<<<10>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 25年12月18日
    すずきさん (12/23 23:51)
    「良く見たらksys_read()でfil...」
  • link 25年12月18日
    すずきさん (12/23 23:15)
    「ですね、まあpread+readだと話が...」
  • link 25年12月18日
    hdkさん (12/21 08:34)
    「昔試しにデバイスドライバーを作ったことが...」
  • link 25年11月28日
    hdkさん (12/04 08:10)
    「あれ、停止直前くらいの時のトルクコンバー...」
  • link 25年11月28日
    すずきさん (12/03 11:24)
    「トルクコンバーターがいてエンブレは掛かり...」

最近の記事20件

  • link 23年4月10日
    すずき (12/21 00:12)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 25年12月19日
    すずき (12/21 00:11)
    「[preadとlseek + readは何が違う?] 目次: Linux前回(2025年12月18日の日記参照)はpreadと...」
  • link 25年12月8日
    すずき (12/20 21:48)
    「[LXPanelのボタン入れ替えが使えないときの直し方] 目次: LinuxLXDEにはLXPanelといってタスクバーやスタ...」
  • link 25年12月18日
    すずき (12/20 19:11)
    「[preadとlseek + readは違います] 目次: Linux知っている人には「なんだそんなことか」で終わりな話なんで...」
  • link 25年12月11日
    すずき (12/19 23:59)
    「[Ubuntuのカーネルパニック画面] 目次: LinuxUbuntu 24.04 LTSで起動中にカーネルパニックを起こすと...」
  • link 22年4月13日
    すずき (12/19 10:49)
    「[C言語とlibc - まとめリンク] 目次: C言語とlibcC言語について。C++言語もたまに。プログラムの落とし穴、演算...」
  • link 16年1月25日
    すずき (12/19 10:48)
    「[紆余曲折だったC++11のoverrideとfinal] 目次: C言語とlibc最近cpprefjp(リンクはこちら)のコ...」
  • link 16年1月8日
    すずき (12/19 10:48)
    「[C, C++の可変引数マクロでのつまづきとGNU拡張構文] 目次: C言語とlibcC99, C++11の可変引数マクロでは...」
  • link 13年8月11日
    すずき (12/19 10:47)
    「[C++とPythonのクラスと動的型付け] 目次: C言語とlibc初めて触れたオブジェクト指向言語がC++で、その次がJa...」
  • link 23年9月11日
    すずき (12/19 10:42)
    「[Windows - まとめリンク] 目次: WindowsWindows XPのブリッジ機能colinuxとWindowsの...」
  • link 08年9月10日
    すずき (12/19 10:42)
    「[Windows PCの容量が足りません] 目次: Windows最近Windowsの入っているパーティション(Cドライブ)の...」
  • link 08年9月11日
    すずき (12/19 10:41)
    「[Windows XPを再インストール] 目次: WindowsCドライブを35GBに切り直してWindows XPを再インス...」
  • link 22年8月16日
    すずき (12/19 10:39)
    「[このWindows PCはN年経過しています] 目次: Windowsゲーム用PCにWindows 10をインストールしまし...」
  • link 22年8月22日
    すずき (12/19 10:37)
    「[DDRのSPD情報からCAS Latencyを取得する] 目次: LinuxDDRメモリモジュールにはSPD (Serial...」
  • link 22年3月18日
    すずき (12/18 00:31)
    「[射的 - まとめリンク] 目次: 射的ガスガン その1ガスガン その2ガスガンが増えました射的射的2回目射的3回目東京マルイ...」
  • link 25年11月30日
    すずき (12/18 00:19)
    「[JTSA Limited大会参加2025] 目次: 射的JTSA Limitedの大会に参加しました。記録は自己ベストが66...」
  • link 25年12月14日
    すずき (12/17 23:58)
    「[エアガンの外部ソース化キットを一部購入] 目次: 射的アキバのターゲット1にて減圧レギュレータ(0.4MPa)とホース、コネ...」
  • link 25年11月28日
    すずき (12/04 02:17)
    「[ジャガーさんの所感] 目次: 車ジャガーXE Sを購入してから4か月が経ちました。通勤で毎日乗っているためか走行距離が3,0...」
  • link 25年11月29日
    すずき (12/02 01:15)
    「[バーベキュー@つくば] 筑波大関連の人が集まってバーベキューするイベントが年1回開かれていて、誘ってもらったので去年から参加...」
  • link 23年5月15日
    すずき (12/02 00:43)
    「[車 - まとめリンク] 目次: 車三菱 FTO GPX '95の話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替え...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 12/23 23:51