6

より一般的に言えば、オペコード !=0 の swi 命令がそのようなカーネルで実行されるとどうなるでしょうか? それは信号を生成しますか?罠にかけたいので質問します。

4

2 に答える 2

0

命令をフィールド化するコードswiはここにあります:http://lxr.linux.no/linux+*/arch/arm/kernel/entry-common.S#L335。私はARMの専門家ではありませんが、CPUはswi、カーネルが引数を取得できる場所に引数を隠していないようです。カーネルが知りたい場合は、呼び出し元のプログラムのランタイムイメージから命令をフェッチする必要があります。これにより、すべてのシステムコールのコストが高くなるため、(私が正しく読んでいる場合)カーネルswiは、でコンパイルされている場合に引数が何であるかをわざわざ調べるだけCONFIG_OABI_COMPATです。

編集:ARM ARMは、SWIがその引数で有用なことを何もしないことを確認します。(物理ページ634 /論理ページA7-118。)

于 2013-01-21T23:19:58.077 に答える
0

ということで、どうなるか見てみました。次のプログラムをコンパイルして実行しました。

#include <stdio.h>
#include <signal.h>

void traphandler(int signum, siginfo_t *info, void *context)
{
  puts("trap");
}

int main() 
{
  struct sigaction sa;
  sa.sa_sigaction = traphandler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = SA_RESTART | SA_SIGINFO;
  sigaction(SIGTRAP, &sa, NULL);
  puts("begin");
  asm("swi 1");
  puts("after swi 1");
  asm("swi 255");
  puts("after swi 255");
}

出力は次のとおりです。

begin
after swi 1
after swi 255

シグナル ハンドラは呼び出されず、プログラムも強制終了されませんでした。非常に残念です。

于 2013-01-20T18:35:11.923 に答える