ARM入門/arm introduction

ARM入門/arm introduction

2020/08/08 ARM入門勉強会の発表資料です。
https://connpass.com/event/180812/

Bdd3fb3269e67bbc512f2530c409a926?s=128

Toshifumi NISHINAGA

August 08, 2020
Tweet

Transcript

  1. ARM⼊⾨ 2020/08/08 ARM⼊⾨勉強会 Toshifumi NISHINAGA @tnishinaga https://speakerdeck.com/tnishinaga/arm-introduction

  2. ⾃⼰紹介 • 名前 • ⻄永俊⽂ • Arm関連でやってきたこと • Cortex-M7マイコンでNOMMU Linuxを動かす

    • SynQuacerをJTAGデバッグ • Raspberry Piを題材にセキュリティ・キャンプで講義 • Link • https://github.com/tnishinaga • https://speakerdeck.com/tnishinaga • https://twitter.com/tnishinaga 2
  3. 謝辞 • 本勉強会を開いてくださったぬるぽへさん • レビュー協⼒いただいたインターネットの闇(@no_maddo)さ ん • これまでお世話になったみなさま 3

  4. 発表の⽬的 • Armアーキテクチャの名前や命令セットの名前を知ってもらい、 今後の学習の役に⽴てていただく 4

  5. Changelog • 2020/08/08 • 初版公開 • 2020/08/13 • 誤り部分訂正 •

    ⾮公開スライド公開 • お役⽴ちリンク追加 5
  6. Armとは 6

  7. Armとは • Arm社の作った RISCアーキテクチャ のプロセッサ 7

  8. Arm社 • 半導体IPを販売する会社 • 本社はイギリス ケンブリッジ • 2016年7⽉18⽇にsoftbankに買 われた •

    https://xtrend.nikkei.com/atcl/trn/column/15/106 1226/072100008/ • 次はNvidiaに買われそう(?) • https://asia.nikkei.com/Business/SoftBank2/Soft Bank-enters-talks-to-sell-Arm-to-Nvidia https://www.arm.com/ より引⽤ 8
  9. 主な⽤途 組み込み機器 デスクトップ・サーバー 画像は以下より引⽤ https://www.96boards.org/product/developerbox/ https://www.gigabyte.com/jp/Press/News/1634 9

  10. x86系プロセッサに⽐べたArmの特徴 • 省電⼒(※) • 低価格(※) • 低発熱(※) • 設計と製造企業が分かれている ※

    最近は⼀概にそうとは⾔えなくなってきている10
  11. Arm社とチップメーカー 11 チップメーカー (Broadcom等) 製造 SoC プロセッサコア (とペリフェラル) を設計 コアとペリフェラ

    ルからSoC製造 IP
  12. 例: Raspberry PiのBCM2835のSoC 12

  13. 例: Raspberry PiのBCM2835のSoC • Arm設計 • プロセッサコア • UARTペリフェラル •

    Broadcom設計 • GPIO、VideoCore、割り込みコントローラー等 • Synopsys(旧DesignWare)設計 • USBコントローラー • 上記をまとめてBroadcomがSoCを製造 13
  14. Armアーキテクチャ とアセンブリ 14

  15. アーキテクチャとアセンブリ • Armアーキテクチャに関して少し詳しくご紹介 • コンテンツ • アーキテクチャとプロセッサ • 実⾏モード •

    各実⾏モードの呼ばれ⽅ • Armのレジスタ • A32モードの場合 • A64モードの場合 • Armアセンブリ • A32アセンブリの特徴 • A64アセンブリの特徴 • Thumbアセンブリ 15
  16. アーキテクチャとプロセッサ • Armはアーキテクチャ名とプロセッサ名がある • 例: ARMv8はアーキテクチャ名 Cortex-A53はプロセッサ名 16

  17. アーキテクチャ • プロセッサの基礎設計を決めるもの • MMU仕様や命令セット等 • 名前はARMvX • Xには数字が⼊る。最新はARMv8 •

    ターゲットの種類によって 更にA, R, Mがつく • 例: ARMv8-A 17 Architecture (ARMv8-A) Cortex -A53 Cortex -A73
  18. A, R, M 18 A SBC・サーバー向け R リアルタイムシステム向け M マイコン向け

  19. プロセッサ(ファミリ) • アーキテクチャ仕様を元に作られたもの • 現⾏はCortex-(A|R|M)[0-9]+ • 基本数字が⼤きいほうが世代が新しくて 性能が良い • big.LITTLEのため例外あり

    19 Architecture (ARMv8-A) Cortex -A53 Cortex -A73
  20. おまけ: big.LITTLE • Armの省電⼒化ソリューション • ⾼性能コア(big)と低性能コア(LITTLE)を1チップに搭載 • 例: • Cortex-A15とCortex-A7

    • Cortex-A73とCortex-A53 • 負荷に応じて使うコアを切り替えて電⼒消費を抑える 20 参考: http://pc.watch.impress.co.jp/docs/column/kaigai/493449.html
  21. Armアーキテクチャだいたいの歴史 21 ARMv3 ~ v4 ARMv5 ARMv6 ARMv7 ARMv8 ARM7,

    ARM7TDMI ARM9, ARM10 ARM11 Architecture Processor Cortex-A,R,M iPhone: Andrew CC BY-SA DS: Kudo-kun CC BY-SA PS VIta: Tokyoship CC BY-SA 参考: https://ja.wikipedia.org/wiki/ARMアーキテクチャ
  22. 実⾏モード • ARMv8から64bit実⾏モード(AArch64(A64))が増えた • 従来からの32bit実⾏モード(AArch32(A32))も存続 22

  23. 各実⾏モードの呼ばれ⽅ • 実⾏モードはOSや資料により呼ばれ⽅が異なる • 32bit実⾏モード • arm(oabi) • armel(eabi) •

    armhf(hard-float) • AArch32(A32) • 64bit実⾏モード • arm64 • AArch64(A64) 23
  24. 例:debianの場合 https://www.debian.org/CD/http-ftp/#stable 24

  25. Armアーキテクチャのレジスタ • Armアーキテクチャのレジスタをご紹介 • A32とA64でレジスタが別物なので分けて解説 25

  26. 主要なA32レジスタ • 汎⽤レジスタ(32bit) : R0 ‒ R12 • 計算等に使う汎⽤レジスタ •

    スタックポインタ: SP(R13) • スタックの先端を⽰すレジスタ • リンクレジスタ: LR(R14) • 関数の戻りアドレスをいれるレジスタ • 分岐命令実⾏時に⾃動でセットされる • プログラムカウンタ: PC(R15) • 次に実⾏する命令のアドレスを⼊れるレジスタ 26
  27. Tips: Armのスタックとスタックポインタ • Armのスタックは基本下位ア ドレス(0xffffffff)から上位アド レス(0x00000000)に延びる • 例: スタックにpushすると sp

    - x番地に値を⼊れ、 spをsp - xに更新する stack sp --> 0x00000000 0xffffffff 27
  28. 主要なA64レジスタ • 汎⽤レジスタ: X0 ‒ X30, W0-W30 • 計算等に使う汎⽤レジスタ •

    Xは64bit, Wは32bit幅アクセスができる • ゼロレジスタ: ZXR, WZR • 読むと0が得られるレジスタ • リンクレジスタ: LR(X30) • スタックポインタ: SP • A64ではシステムレジスタ扱い • プログラムカウンタ: PC • A64ではシステムレジスタ扱い 28
  29. Armアセンブリ • 現在命令セットは⼤きく以下の3つがある • A32 • A64 • Thumb(T32, Thumb,

    Thumb-2) 29
  30. A32(ARM)アセンブリ • ARMv7以前およびA32モードで使う • 32bit固定⻑命令セット • おもしろ機能 • 条件付き命令実⾏ •

    バレルシフタ 30
  31. 条件付き命令実⾏ • 任意の命令を条件付き実⾏できる • 例: 演算結果が0の場合にAND命令を実⾏したい場合 • ANDEQ r0, r0,

    r1 • 何もつけないとAL(無条件)で実⾏される • AND == ANDAL • ARMバイナリに0x0Eが⼀定間隔で並ぶのはこのため • https://tnishinaga.hatenablog.com/entry/2017/05/20/040819 31
  32. 32

  33. バレルシフタ • 命令内で値をシフト(or ローテート)する機能 • メリット • 命令数の削減ができる • でかい値を即値でロードできる

    • ただし、8bitをシフトして作れる値のみ • 例: • r0にr1の値を1bitシフトして⼊れる • mov r0, r1, lsl #1 • r0に0x80000000を⼊れる • mov r0, #0x800000000 33 2020/08/13 追記: バレルシフタはA64命令セットでも利⽤可能でした
  34. 35

  35. A64アセンブリ • ARMv8以降のA64モードで使う32bit固定⻑命令セット • 特徴 • 特徴がないのが特徴 • 素直な命令と親切さにより⾮常に書きやすい 36

  36. 親切になった部分の例 • VBAR(割り込みベクタベースレジスタ)へのアクセス • A32 • MCR p15, 0, <Rt>,

    c12, c0, 0 • A64 • MSR VBAR_EL1, <Xt> 37
  37. 例: A32とA64コードの差 • 階乗を求めるコードをビルドして⽐較 38

  38. 39

  39. 40

  40. Thumbアセンブリ • Thumb • (ほぼ)16bit固定⻑命令 • Cortex-M0, M0+で現役 • 基本レジスタR0-R7しか指定できない

    • オペコードにレジスタ指定部が3bitしかないため • Thumb2(T32) • 16, 32bit混合 • Cortex-M3以降で現役 • (命令数が少ないが)⼤体A32命令と同じ使い勝⼿ 41
  41. 42

  42. まとめ 43

  43. まとめ • ArmはArm社の作ったRISCアーキテクチャプロセッサ • 主に組み込みで利⽤されてたが最近はサーバーにも進出 • ARMvXはアーキテクチャ名、Cortexはプロセッサ名 • 最近のArmは64bitモードが有る •

    A64命令は素直。どんどん使っていこう。 44
  44. より知りたい⼈のための資料集 • ARMv8-Aアーキテクチャマニュアル • Arm Architecture Reference Manual Armv8, for

    Armv8-A architecture profile • https://developer.arm.com/documentation/ddi0487/fc • アセンブリ • A32/A64命令セット • Arm® Instruction Set Reference Guide • https://static.docs.arm.com/100076/0100/arm_instruction_set_reference_guide_100076_0100_00_en.pdf • A32命令セット • ARMで学ぶ アセンブリ⾔語⼊⾨, 出村成和, C&R研究所 • VisUAL(GUIのA32アセンブリエミュレータ) • https://salmanarif.bitbucket.io/visual/ • A64命令セット • The A64 instruction set • https://static.docs.arm.com/100898/0100/the_a64_Instruction_set_100898_0100.pdf • Thumb命令セット • Thumb 16-bit Instruction Set Quick Reference Card • https://developer.arm.com/documentation/qrc0006/e/ 45