【※ 当記事は2020年7月2日時点の情報です】
ペイヴメント(@pavement1234)です。
イマドキ、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エミュレーションの状況についてご紹介しました。
関連記事(プログラミング)
【プログラミング】マルチコア環境における排他制御の課題
【プログラミング】gccの基本オプションの使い方
【C言語】デバッグのテクニック(標準関数のスタブ作成、動的ライブラリのデバッグ方法)
【プログラミング】迂回(Detours)という技術について
【プログラミング】64bit OSの32bitエミュレーションの状況