1

私はコードがCで書かれることを保証します。

コンパイラがコード(字句解析、構文解析など)に準拠し、コードをアセンブリコードに変換してから、アセンブラがコードをマシンコードにアセンブルし、最終的にハードウェアで実行されることを調べました。したがって、システムコール用に記述されたコードが移植可能かどうか、つまり、同じコードを一部のハードウェアでコンパイルする場合、このコードは実行されるのでしょうか。

アーキテクチャに依存する部分はコンパイラだけであり、他のアーキテクチャでコンパイルされたシステムコールは正常に実行されると言っているのは正しいですか?

4

2 に答える 2

2

システムコールは、オペレーティングシステムとアーキテクチャによって異なります。ほとんどの場合、アーキテクチャまたはオペレーティングシステムが異なる場合は、プログラムを再コンパイルする必要があります。

たとえばsbrkbrkmalloc()に使用されるシステムコール、つまりWindowsでは使用できない動的メモリ割り当て。

Windowsでmallocがどのように実装されているかを参照してくださいWindowsのメモリ割り当てに関する質問

システムコールには、「マシンアーキテクチャに依存しない」と「マシンアーキテクチャに依存する」の2種類があります。

独立したマシンアーキテクチャのみを使用する場合は、移植の心配はあまりありません。

あなたの質問に答えるために来る: それはあなたが使用したシステムコールに依存します。ただし、再コンパイルは必須です。

于 2012-12-07T11:28:41.427 に答える
0

呼び出し自体を考慮しなくても、呼び出し規約はハードウェアアーキテクチャによって大きく異なります。例えば:

  • 古いx86:int
  • Intel Newer x86 / 64:sysenter/sysexit
  • AMD x86 / 64:syscall/sysret
  • 腕:swi 0x420000

明らかに、これらのどれも実際には互換性がありません。したがって、ほとんどのx86アセンブリは古いx86、新しいIntel x86 / 64、およびAMD x86 / 64で動作しますが、システム呼び出しは異なります。Linux VDSOのような抽象化を使用する場合でも、VDSOがどこにあるかについてはアーキテクチャに大きく依存します。

通常の関数呼び出しの場合、スタックとレジスタの違いのためにアーキテクチャ間で異なる呼び出し規約と関係があります。

言い換えれば、アセンブリコードがクロスアーキテクチャであるということはほとんどありません。

于 2012-12-07T14:51:04.067 に答える