アセンブリコードから呼び出されるC関数を書いています。
(具体的には、Linuxカーネルのシステムコール処理のパスでチェックジョブを実行したいので、entry_32.Sでシステムコールがディスパッチされる前にc関数を呼び出します)
c関数を定義するときに、「asmlinkage」修飾子と混同されます。
asmlinkageは、パラメーターがスタックを通過することをコンパイラーに通知することです。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
質問:
(1)アセンブリコードから呼び出される関数を定義する場合、asmlinkageは必要ですか?
(2)gccのデフォルトの呼び出し規約は何ですか。ac関数を定義するときに「asmlinkage」を省略した場合、それは_cdeclまたはfastcallを意味しますか?
(3)デフォルトの呼び出し規約がcdeclの場合、cdeclがasmlinkage修飾子と等しいと考えると、なぜasmlinkageが必要なのですか?(私はここで正しいですか?)
(4)これらのシステムコール関数がすべてasmlinkageで宣言されているのはなぜですか。最初にパラメータをレジスタにコピーしてから、それらのシステムコール関数を呼び出すことはできますか?私の見解では、x86では、システムコールを発行するときに、パラメーターはレジスターに簡単に保存されます。では、なぜわざわざスタックに保存して、スタック規則を介してそのような受け渡しパラメーターを強制するのでしょうか。
最後に、そのようなミックスアセンブリ/ cプログラミングのために私が参照できるいくつかのリソース/本を誰かが推薦できますか?