【※ 当記事は2020年7月2日時点の情報です】
ペイヴメント(@pavement1234)です。
64bit OSの32bitエミュレーションの状況を知りたい。
こんな悩みを解決します。
イマドキ、Intel CPUを搭載したパソコンは64bit CPUが主流かと思います。何気なく32bit時代から使い続けてる各種フリーソフトを使い続けてますが、どうやって64bit上で動作させているんだろう。という素朴な疑問を持ち、この記事を書きました。
Windowsの状況
64ビット版 Windows 上で32ビット版ソフトウェアは動作するのか、その逆はどうなのかとか32bitアプリを64bit Windows 7で動かす「WOW64」を読んでみたところ、WOW64(Windows 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回データアクセスが発生するので無駄(x86もunaligned accessすると2回データアクセスするみたい)。
というわけで、ACアダプタで動き、CPUもメモリも潤沢に積んでて、64bitのソフトが豊富にそろっている環境であれば、64bitでやることに異論はありませんが、電池駆動で32bitのソフトしか揃ってないのに無理やり64bitにしなくてもよいのでは?と思ったりします。
とはいえ、64bitプログラミングにはカナリ興味あるので、そろそろラズパイ3とかJetson Nanoとか弄り倒そうと心に誓った次第です。
まとめ
64bit OSの32bitエミュレーションの状況についてご紹介しました。
関連記事(プログラミング)
ITスキルを身につけると条件の良い転職が可能になる
ITスキルを身につけると条件の良い転職が可能になります。当ブログがそのキッカケになったら幸いです。