私の先生は、syscall を実行しない C 関数を書くように私に依頼しました。関数が何も達成しないことは問題ではありません。
次の関数はシステムコールを実行しますか?
int func() {
return 0;
}
もしそうなら、私が探しているような模範的な関数を教えてもらえますか?
どうもありがとう。
私の先生は、syscall を実行しない C 関数を書くように私に依頼しました。関数が何も達成しないことは問題ではありません。
次の関数はシステムコールを実行しますか?
int func() {
return 0;
}
もしそうなら、私が探しているような模範的な関数を教えてもらえますか?
どうもありがとう。
コード自体にシステム コール (要件を満たすもの) が含まれていなくても、バイナリの一部でなくても、プロセスを実際に初期化、実行、停止、およびクリーンアップするための暗黙のシステム コールがいくつかあります。どのシステム コールが実行されるかは、プラットフォームに依存します。さらに、少なくとも終了ステータスは、プロセスをシャットダウンする方法に応じて設定されます: return ステートメントと main() の exit()
先生はそのコードに満足すると思います。標準ライブラリを使用していません。標準ライブラリには、さまざまな目的のための多くのシステム コールが含まれています (他のほとんどのライブラリと同様)。stdin/out やファイル/ソケットなどから読み書きすることはできません。そのため、IO、プロセスの作成とマルチスレッド化、同期などを行うことはできません。ここでは、ユーザー スレッドとスピンロックは注目に値する例外かもしれません)。システムコールなしで有用なユーザーランドプログラムを書くことはできません。ただし、いくつかの引数を取り、結果が として返されるプログラムint
(コマンドラインツールなど) は除きます。「完全に静かな」CPU 加熱機能を実装することもできます。
いいえ、サンプル関数はシステム コールを作成しません。確実にコンパイルして逆アセンブルすることができます:
$ 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
はい、上記にはシステムコールがあります。システム コールがあるたびに ptrace() を使用して停止することができ、システム コールがあることがわかります。オペレーティングシステムなしで、プログラムをメモリからロードおよびアンロードするには、どうすればよいでしょうか?