7

私の先生は、syscall を実行しない C 関数を書くように私に依頼しました。関数が何も達成しないことは問題ではありません。

次の関数はシステムコールを実行しますか?

int func() {
  return 0;
}

もしそうなら、私が探しているような模範的な関数を教えてもらえますか?

どうもありがとう。

4

3 に答える 3

6

コード自体にシステム コール (要件を満たすもの) が含まれていなくても、バイナリの一部でなくても、プロセスを実際に初期化、実行、停止、およびクリーンアップするための暗黙のシステム コールがいくつかあります。どのシステム コールが実行されるかは、プラットフォームに依存します。さらに、少なくとも終了ステータスは、プロセスをシャットダウンする方法に応じて設定されます: return ステートメントと main() の exit()

先生はそのコードに満足すると思います。標準ライブラリを使用していません。標準ライブラリには、さまざまな目的のための多くのシステム コールが含まれています (他のほとんどのライブラリと同様)。stdin/out やファイル/ソケットなどから読み書きすることはできません。そのため、IO、プロセスの作成とマルチスレッド化、同期などを行うことはできません。ここでは、ユーザー スレッドとスピンロックは注目に値する例外かもしれません)。システムコールなしで有用なユーザーランドプログラムを書くことはできません。ただし、いくつかの引数を取り、結果が として返されるプログラムint(コマンドラインツールなど) は除きます。「完全に静かな」CPU 加熱機能を実装することもできます。

于 2013-06-14T17:17:25.397 に答える
2

いいえ、サンプル関数はシステム コールを作成しません。確実にコンパイルして逆アセンブルすることができます:

$ cc -O3 -c example.c 
$ objdump -d example.o 

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <func>:
   0:   31 c0                   xor    %eax,%eax
   2:   c3                      retq   

または最適化なしで、それが重要な場合:

$ cc -c example.c 
$ objdump -d example.o 

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <func>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   b8 00 00 00 00          mov    $0x0,%eax
   9:   5d                      pop    %rbp
   a:   c3                      retq   
于 2013-06-14T17:07:09.133 に答える
1

はい、上記にはシステムコールがあります。システム コールがあるたびに ptrace() を使用して停止することができ、システム コールがあることがわかります。オペレーティングシステムなしで、プログラムをメモリからロードおよびアンロードするには、どうすればよいでしょうか?

于 2013-06-14T17:04:06.737 に答える