見出し画像

CPUでプログラムが動くのは当たり前じゃない

こんにちは。プログラマ歴30年のムンペイです。
主にソフトウェア開発に携わってきましたが、ときにはハードウェアの知識が、ソフトでは解けない問題を解決する鍵になることがあります。今回は、そんな「ソフトだけじゃ見えない世界」の体験談をお届けします。

ソフトウェアが動き出す”その前”を知る

マイナーなマルチコアCPUを搭載したアクセラレーションボードの開発チームに携わっていた時のことです。そのCPUは、電圧制御、多種のメモリへの対応、周辺機器との接続など、高度な機能を持つモダンなものでした。

ただし、このCPUを動かすには、起動前に基本的な設定——たとえば、電圧やメモリ種別、チャネルの構成など——を済ませる必要がありました。
これが、いわゆる「ブートストラップ」と呼ばれる処理(あるいはプログラム)です。

※「ブートストラップ」とは、靴のかかとについている輪(ブーツストラップ)のことで、英語では「自力で何かを成し遂げる」という意味で使われます。由来は、ほら吹き男爵が自分のブーツストラップを引っ張って空中を歩いたという話から来ているとも言われています。

では、その設定をどう行うか?
実は、マルチコアCPUの設定を行うために、別に小さなマイコン(マイクロコントローラ)が搭載されていました。

「でもそのマイコンも設定が必要なんじゃない?」と思うかもしれません。
実はこのマイコンは、起動時に接続されたメモリのアドレス0番地から実行を開始する設計になっていて、自力で立ち上がれるのです。

※ちなみに、x86系CPUでは電源投入後にアドレス 0xfffffff0 から実行を開始するという仕様になっており、BIOSが格納されたROMがそこに接続されています。

こうして、「ソフトウェアが動く前に何が起きているか」というハードウェアの知識を持つことで、ブートストラップ処理というソフトウェア開発の仕事が達成できたのです。

オシロスコープで信号を“見る”デバッグ

このマルチコアCPUのブートストラップ中のデバッグは、非常に困難を極めました。電源を入れても何の反応もない状態のCPU。起動用マイコンから設定ベクタ(ConfigRingと呼ばれていました)を流し込むのですが、うまく起動してくれません。

問題の切り分けが必要でした。設定値が間違っているのか?それとも正しく送信されていないのか?仕様書を見ても「設定できる値の範囲」しか書かれておらず、「今、どの値にすべきか」は自分で判断するしかありません。

まずは、計算した設定値が本当にCPUに届いているかを確認することにしました。
ネットワークのようにパケットを覗く仕組みもないので、やむなくマイコンからCPUへつながるシリアル信号線にオシロスコープを接続して、実際に流れる信号を確認することにしたのです。

マザーボードの信号をオシロスコープで見るイメージ

ただし、ConfigRing以外の信号も多く流れているため、対象の信号を特定するのは簡単ではありません。そこで**トリガー(開始条件)**として、ConfigRing送信直前にLED表示用に 0x55 という特徴的な値を流し、オシロスコープがその瞬間を起点として波形を記録できるようにしました。

※記憶が曖昧な部分もありますが、当時はこのような工夫をしていたはずです。

オシロスコープ上に表示された矩形波を「0」と「1」として読み解き、約1000ビットのConfigRingを一つひとつ確認。結果、自分が計算した値が正しく送信されていたことがわかり、次の問題解決に進むことができました。

まとめ:ソフトウェアだけでは解けない問題もある

ソフトウェアの開発に携わっていると、コードやコンパイル、フレームワークの話ばかりに目が向きがちです。しかし、プログラムが動く「前」の世界——電気が流れ、回路が信号を受け取り、プロセッサが初めて目を覚ます瞬間——を知っていると、トラブルシューティングやシステム全体の理解が格段に深まります。

ハードウェアの知識があることで、ソフトウェアの奥が見えるようになるのです。それがさらに高度なソフトウェア開発の土台になるのですが・・・この話はまたの機会に。

これにて御免!

いいなと思ったら応援しよう!

30年プログラマー・ムンペイ サポートのご検討ありがとうございます。 いただいたサポートは Code & Magic の開発運営などに使わせていただきます!