by shigemk2

当面は技術的なことしか書かない

Tricky implementatoin Of Go ARM soft float #kernelvm

@tetsu_koba

誰得かよく知らない

Golang for ARM Linux

  • ツールチェインのビルド
  • ソースコードを入手してコマンドを入手したらソースコードからビルドできる
$ GOOS=linux GOARCH-arm GOARM=5 make.bash

実行型のビルド

GOARM

  • GOARM=5 For armv5, no FPU, soft float
  • GOARM=6(RaspPiの初代など) For armv6 デフォルト
  • GOARM=7 For armv7 (32)

以上。

間違えなければどうということはない。

が、間違えたから理解が深まることもある

ツールチェインのビルドミス

  • GOARMを指定しないと6になる
  • デキた実行ファイルを実機に持って行って実行すると→Illegal Instruction

ランタイムライブラリがGOARM=6でビルドされているからか!

vldr d2, [r3]

やり直し。GOARM=5

逆アセンブルして確認→FPU命令がまだあるぞ

Go1.4はarmv5サポートはなくなった?

Go ARMがカーネルコンフィグに依存するとはどこにも書いていない

謎の関数 _sfloat

フロート演算のコードに共通する謎関数

_sfloat →vlop_arm.s

実体は、FPU命令のインタープリタ

pc...プログラム・カウンタ?

あ、これ、ARMの命令をインタプリタしている

プログラム・カウンタは違ったところを指している

GOARM=5と6の違い

  • どちらもFPU命令を生成
  • GOARM=5の場合はFPU命令の塊の前に_sfloatへの呼び出しが挿入される(リンカーがそれをやってる)
  • 生成されたFPU命令は同じ(コンパイラはsoft floatのための命令を生成していないので実装は楽)
  • ARMv5とかいる?みたいなまさかり

結論

  • Golangは自前でsoft float emulationする仕組みを持っている
  • カーネルのsoft float emulationは不要
  • 正しくビルドすれば動く

その他

  • アプリをビルドするときにGOARM=6にすると、カーネルが動いてFPUがあるかどうかを確認するルーチンが存在したりする
  • 失敗したぶんだけ勉強するハメになる