64ビットバージョンから32ビットプログラムを作成するにはどうすればよいですか?



How Make 32 Bit Program From 64 Bit Version



解決:

いいえ、これは不可能です。 x86とx64がどのように作成されたか、そしてこれがプログラミング全般にどのように影響するかについての基本を説明する必要があることを考えると、その理由は非常に広く、SuperUserには広すぎる可能性があります。

しかし、簡単に説明すると、それはこれに帰着します:



以前は、16ビットプロセッサがありました。その後、Intelはx86としても知られる最初の32ビットプロセッサを製造しました。これは8086、80286(略して286)などです...これは基本的に16ビットプロセッサへの変更であり、追加の命令セットが追加されています。プロセッサシリーズが新しくリリースされるたびに、Intelはプロセッサフ​​ァミリに命令セットを追加しました。これにより、最終的に、命令セットには多くの命令が含まれるようになりました。 Intelは、下位互換性がないことを意味するため、古い命令セットを削除することはできませんでした。Intelは、古いプロセッサを引き続きサポートしたいと考えていました。

プロセッサは32ビットであるため、上限、つまり最大の32ビット数があります。これは、メモリ割り当てが最大で約3.5GBになることを意味します。



当時、コンピューターはそれほど強力ではなかったので、Intelが最初から64ビットを目指すとしたら、同じ数値の計算にはるかに多くの時間が費やされ、計算する数値が大きいという理由だけでパフォーマンスが低下することを意味します。

それに加えて、32ビットプロセッサは長い間非常にうまく機能しました。

ある時点で、AMDは市場に参入し、64ビットプロセッサを導入しました。 AMDは、32ビットとの下位互換性を可能にするために32ビットのIntel命令セットをそのまま維持しながら、64ビットでの作業を可能にする独自の命令セットを作成しました。



それらが実際には異なる命令セットであることを考えると、32ビットプログラムを作成するプログラマーは、64ビットプログラムを作成するときとは異なるルーチンを呼び出します。

これが難しい理由を説明したので、プログラミングの観点から問題を説明し続けましょう。

プログラムをコーディングするときは、最初にコードを記述します。コードが32ビットプログラムと下位互換性がある場合、64ビットの数値を使用したり、3,5ギガを超えるメモリを同時にアドレス指定したりすることはできません。基本的に、32ビットプログラムが直面する制限を超えることはできません。超えた場合、プログラムがクラッシュします。

これでコードができたので、実際にプログラムを実行できるのはあなただけです。他の人があなたのプログラムを実行できるようにするには、コードを実行可能ファイルにコンパイルする必要があります。これは、読みやすいコードがプロセッサが理解できる命令に変換されることを意味します。コンパイル時に、プログラムをx86またはx64のどちらで実行するかを指定すると、コンパイラはそのプロセッサアーキテクチャに基づく命令セットを使用してコードを生成します。

ご覧のとおり、実行可能ファイルを変更して別の実行可能ファイルで機能させることはできません。最初にプログラムをコードに逆コンパイルしてから、別の命令を使用して再コンパイルする必要があります。

とは言うものの、x86用にコンパイルされたプログラムがx64でネイティブに動作することを考えると、プログラマーはx86アーキテクチャーの限界を打ち破ろうとしているので、x64プログラムを作成すると考えるのが安全です。したがって、x64バージョンをx86バージョンに変換したとしても、32ビットプログラムで実行できる制限を超えるため、プログラムが不安定になる可能性があります。


理論的にはそれが可能です!

中立的なバイトコード/内部表現から、最新のコンパイラ/ JITterの動作のように、特定のアーキテクチャのバイナリに変換する方法があります。現在のアーキテクチャで別のアーキテクチャのプログラムを実行するエミュレータもあります。 Bochsとqemuは最も有名なものの2つです。見る:

  • x86-32プロセッサでx86-64ASMを実行する
  • x86以外のホストマシン上のエミュレーターからWindowsを実行するにはどうすればよいですか?

それにもかかわらず、基本的にすべてのシステムとライブラリの呼び出しをエミュレートする必要があるため、単一のバイナリに対してそのようなコンバーターを作成している人はまだいません。その場合は、とにかくエミュレーター全体を実行する方がよいでしょう。 Qemuにはユーザースペースのみをエミュレートする機能もあるため、本格的なOSがなくても、必要なライブラリとともにプログラムを実行することが実際に可能です。ただし、いつものように、エミュレーションはWebブラウジングやメディア再生などのパフォーマンスに敏感なものを対象としたものではありません。

ただし、x86PCが 32ビットのみ 、つまり、すでに10年以上経過しているということです。 Pentium 4PrescottのほとんどすべてのIntelCPU 2004年 以降(一部の初期のAtom CPUを除く)およびAthlon64のすべてのAMDCPU 2003年 以降は64ビット対応です。更新する時が来ました。

PCがx86_64およびVT-xをサポートするのに十分新しい場合は、32ビットホスト内で64ビット仮想マシンを実行できますが、推奨されておらず、パフォーマンスは64ビットホストを実行するよりもさらに悪くなります。内部に32ビットVM。 64ビットOSは、多くの人が考えているように32ビットOSと比較して2倍のメモリを必要としないため、RAMが2GBしかない場合でも、64ビットOSは、レジスタ数が2倍で、多くの場合、一般的に高速です。他のもの。 1〜2 GBのRAMについては議論の余地がありますが、64ビットを使用します


とは言うものの、セキュリティ対策に関しては、最近の32ビットOSはしばしば セキュリティパッチの遅れ 開発者全員が64ビットシステムを実行しているためです。たとえば、MeltdownパッチとSpectreパッチは、64ビットLinuxにパッチが適用されてから半年以上後に32ビットLinuxにプッシュされます。 Meltdownパッチは64ビットのWindows10ビルド1507以降に提供されていますが、32ビットのユーザーはビルド1511以降のみ保護されています。パッチが適用されている場合でも、 このような古いマシンは通常、パフォーマンスへの影響がはるかに大きくなります 彼らは減速を相殺するための新しい指示と機能を持っていないからです。そのため、ユーザーから明示的に指示されない限り、MSは一部の古いPCでパッチを有効にしません。パフォーマンスの低下に加えて、32ビットパッチは バギーになる可能性が高い テスターの数が大幅に少ないためです。 Linuxの32ビットカーネルがメルトダウンの緩和を受けてからバギーになっているを参照してください。

IntelのMeltdownの脆弱性が公開されてから(そしてx86_64が軽減されてから)、LinuxKPTIがx8632ビットでMeltdownを軽減するのを確認するのに数か月かかっただけでなく(1月の開示から7月のメインラインの準備まで)、結局は公開されましたLinux5.3で2018年夏から現在[2019年7月28日]までカーネルに存在していた32ビットのみのバグ。

時々彼らは パッチはまったく適用されません 十分なユーザーベースがないため、多大な労力を費やすインセンティブがほとんどありません。問題はまたです 修正できません ハードウェアのバグの場合、ハードウェアサポートなし。たとえば、SpectreやL1TFなどの最近のサイドチャネル攻撃でも更新されたマイクロコードが必要なため、CPUやメインボードの製造元がファームウェアの更新をリリースしない場合は、運が悪いことになります。これらのバグは過去20年間にCPUに影響を及ぼしますが、非常に古いシステムにパッチを提供することはできません。 Windows 7は、SSE2のサポートなしでパッチを適用するのが難しすぎるため、またはそれらのCPUで実行している人が少なすぎるため、Pentium3のサポートも終了しました。

32ビットWindowsも、次の理由でより脆弱です。

  • ホットパッチ機能は少なくなります。 64ビットカーネルの100%と比較して、32ビットWindowsカーネルの約30%のみがホットパッチ可能です。また、カーネルパッチ保護もサポートしていません
  • 64ビットWindowsのようにドライバーに署名する必要はありません
  • ASLRが機能するスペースが少ない

エミュレーターで64ビットOSを実行すると、さらに遅くなります。また、クロール速度を受け入れてエミュレーターを使用した場合でも、ホスト上のマルウェアは、このような脆弱なシステムの仮想マシンを攻撃する可能性があります。繰り返しになりますが、セキュリティに本当に関心がある場合は更新する必要があります。そうでない場合は、セキュリティで保護されていないシステムを無期限に使用する必要があります。

参考文献:

  • 32ビットは64ビットより安全ですか?
  • 64ビットWindowsは32ビットより安全ですか?
  • 64ビットバージョンのWindowsがより安全である理由
  • 32ビットのコンパイル済みバイナリを64ビットに変換する方法

これは技術的に可能です。プロセスは呼び出されます バイナリ変換

ほとんどの場合、これは、異なるプラットフォーム(x86上のARM、ARM上のx86など)のエミュレーター、またはハードウェアアクセラレーションが利用できない仮想化で実行されます。

あなたが直面する最大の問題は、ほとんどのプログラムを単純に真空で実行することはできないということです。これらはオペレーティングシステムのABIに依存し、通常はアーキテクチャによって異なります。これは、OSとのすべての対話(API呼び出しなど)のために翻訳レイヤーを追加する必要があることを意味します。その時点で、OS全体をエミュレートすることもできます...これはphuclvの回答で説明されています。