イマドキ、Intel CPUを搭載したパソコンは64bit CPUが主流かと思います。何気なく32bit時代から使い続けてる各種フリーソフトを使い続けてますが、どうやって64bit上で動作させているんだろう。


  • Windowsの状況
64ビット版 Windows 上で32ビット版ソフトウェアは動作するのか、その逆はどうなのかとか32bitアプリを64bit Windows 7で動かす「WOW64」を読んでみたところ、WOW64Windows 32-bit On Windows 64-bit)と呼ばれる32bitアプリケーションのエミュレーター(エミュレーションレイヤーサブシステム)が搭載されているみたい。でも32bitドライバはダメみたい(ドライバは物理アドレスを意識するから、そりゃだめか)。

更に32bit vs 64bit Windows 7を入れるならどっちだ?という32bitと64bitの性能を比較したサイトを見ると、4GB以上のDRAMを搭載していれば概ね64bitの方が高速の様子。

まあ、自分のPCを考えても不都合なく32bitアプリを使えてるわけで。

あと、@ITの第4回 64bit版デバイス・ドライバ (1/3)あたりを見ると、デバドラは64bit対応必須みたい。(x64 Windows7に無理矢理32bit ドライバを適用。(できる事もあるのだ)というサイトを見ると強引に32bitドライバが使えたケースもあったみたいですが、例外ケースと思われ。)
  • Linuxの状況
64bit-Linuxで32bitバイナリ実行環境を構築を読むと、Ubuntu(64bit)等で、32bitライブラリ(ia32-libs、lib32z1、lib32ncurses5、lib32bz2-1.0など)を追加インストールすると32bitプログラムが動かせるようです。

また、64bit環境での32bitプロセスの動作を見ると、ProtectedモードとかIA-32eモードとかがあって、適宜モードを切り替えながら動作させているとのこと。要は難しいってことと理解。

32bitのライブラリを呼び出しつつ、実行モードを切り替えるって感じですかね。
  • ちょっと脱線して、ラズパイ3の64bit OS対応について
ラズパイはどうか。Raspberry Pi 3のRaspbian はrootfsもkernelも32bitだったってページを見て衝撃を受けました。有名なRaspbianは32bitしかないみたい。確かに自分のラズパイ3も、ARM CortexA53の64bit CPUのハズなのに、ブートログを見たら32bitなアドレス空間表示でした。

Raspberry PiのOSのRaspbianが64bit化されていので実は32bitでしたを見ると、ラズパイ3に搭載されているBCM2837のARMコア、CortexA53は64bitモードと32bitモード両方サポートしてるので、そういうことが出来るみたい。

Raspberry Pi 3 を64bitモードで動かすイメージをBuildrootで作るみたいなツワモノが64bit化にチャレンジしていますが、Raspberry Pi 3系の AArch64 64bitモードに対応している OSの一覧まとめ 2018年版をみると、Ubuntu18とかArch Linuxがラズパイ3の64bit対応をしてるみたい。

というわけで、Linux界隈は64bit対応の過渡期の様相ですね。
  • 詳しいことはさて置き、64bitって要るの?
まぁ、4Kとかの映像を録画する場合、果てしない容量のHDDが必要なことは容易に想定できるし、DRAMもたくさん必要になることと思うので、将来的には確実に必要と理解しています。

しかし、特定用途向けの組み込みデバイス。特にバッテリ駆動系で映像とか扱わないヤツが、無理して64bit化するのは如何なものか。

アドレスが64bitに拡張されるので、命令長も64bit?…となるとプログラムサイズも倍?と一瞬焦りましたが、AArch64を読むとそこは大丈夫みたいで命令長は32bitらしい。
AArch64ステート
・A64命令セット(32bit長)
AArch32ステート
・A32命令セット(32bit長)
・T32命令セット(16bit長。Thumbのこと。)
しかしメモリアライメントとか構造体のバウンダリは64bitだろうから、シロートがプログラムを書くと、それなりに肥大化する予感。

あと、Intel(x86)用のドライバをARMに移植するときに、アライメント例外に悩まされたことがありますが、その手の問題が出ないことを祈ります。

詳しく言うと、Armのunaligned accessについてとか、データ型のアラインメントとは何か,なぜ必要なのか?にある通り、ARM(RISC)はアドレス境界に厳格でして、奇数アドレスにワード長(2バイト以上)の変数を置いたり、アドレス0x00000002から4バイト変数を読み書きするとカンタンに例外が発生して死にます。ARMv5までは避けようがありませんでした。ARMv6ではunaligned accessを許可するレジスタがある(2.10. アンアラインド データアクセスおよびエンディアン混在データアクセスのサポート)ので回避できるけど、2回データアクセスが発生するので無駄。(x86もunaligned accessすると2回データアクセスするみたい)。

というわけで、ACアダプタで動き、CPUもメモリも潤沢に積んでて、64bitのソフトが豊富にそろっている環境であれば、64bitでやることに異論はありませんが、電池駆動で32bitのソフトしか揃ってないのに無理やり64bitにしなくてもよいのでは?と思ったりします。

とはいえ、64bitプログラミングにはカナリ興味あるので、そろそろラズパイ3とかJetson Nanoとか弄り倒そうと心に誓った次第です。

続く

IMG_20190407_163547







スポンサードリンク