关于unix:是否可以实现不执行任何系统调用的C程序?

Is it possible implementing a C program which does not perform any system calls?

老师让我写一个不执行任何系统调用的C函数。这项功能什么也做不了。

以下函数是否执行任何系统调用?

1
2
3
int func() {
  return 0;
}

如果有,你能给我一个像我要找的那样的例子吗?

谢谢。


即使代码本身不包含系统调用(什么可以满足要求),也有一些隐含的系统调用来实际初始化、运行、停止和清理进程,即使它们不是二进制文件的一部分。执行哪些系统调用取决于平台。此外,至少会根据关闭进程的方式来设置退出状态:在main()中返回语句vs exit()。

我想,你的老师会对这段代码感到满意的,它不使用标准库,因为标准库本身包含许多不同目的的系统调用(就像大多数其他库一样)。您将无法读取/写入标准输入/输出和文件/套接字等。因此,您不能执行IO、进程创建和多线程、同步等操作,因为所有这些操作都需要系统调用(比如用户线程和spinlocks可能是一个显著的例外)。没有系统调用就不能编写有用的userland程序,除非程序接受了一些参数,结果返回为int(例如命令行工具)。您还可以实现"完全安静"的CPU加热功能。


不,您的示例函数不进行任何系统调用。您只需编译和反汇编即可确保:

1
2
3
4
5
6
7
8
9
10
11
$ 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

或者不进行优化,如果这很重要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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()来停止,您将看到有系统调用。如果没有操作系统,如何从内存加载和卸载程序?