是什么决定了程序进行哪些系统调用?
What determines which system calls a program makes?
所以我有一个 C/C++ 程序,它不 运行 某个计算机系统模拟器,因为它进行的系统调用未在该模拟器中实现。现在我想知道是什么决定了程序进行的系统调用。它只是编译器吗?或做 OS 之类的事情,硬件也发挥作用。模拟器在 ubuntu 14.04 上进行了测试,所以我想知道在 ubuntu 14.04 系统上编译程序是否会产生程序发出的不同系统调用?
一些上下文信息:
我自己的电脑是 运行ning Windows 10(64 位),我正在使用 wsl 终端在 VS 代码中编译程序。我想 运行 在名为 Multi2Sim 的计算机系统模拟器上运行此程序。我 运行 在我的 windows 计算机上的 docker 容器中安装这个模拟器。当在 docker 集装箱码头 运行ning lsb_release -a
时,它产生 ubuntu 14.04
。该程序不在模拟器上 运行,因为它进行了系统调用 getdents64(),但尚未在模拟器中实现。
模拟器在 ubuntu 14.04 上进行了测试,所以我在想如果我在那个 os 上编译它可能会改变系统调用。我使用了 -m32
标志,因为模拟器不支持 64 位 ELF 文件。
一些输出显示了运行正在使用的编译器等版本:
当 运行ning uname -a
在容器中时,我得到:
Linux 66510ea7ce2e 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
g++ --version
在我的 windows 计算机上的 wsl 终端:
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
g++ -dumpmachine
在我的 windows 计算机上的 wsl 终端:
x86_64-linux-gnu
生成文件:
TARGET = bandwidth
.PHONY: all clean $(TARGET)
# directories
INC_DIR = ../include
KERN_DIR = ../kernels
CMN_DIR = ../common
OBJ_DIR = obj
# compiler flags
CXX = g++
CXXFLAGS = -m32 -O3 -fopenmp -march=native -I$(INC_DIR) -std=c++14 $(USER_DEFS)
# header files
HEADERS = $(wildcard $(INC_DIR)/*.h)
# src files
SRC = $(wildcard *.cpp) $(wildcard $(KERN_DIR)/*.cpp) $(wildcard $(CMN_DIR)/*.cpp)
# object files
OBJ = $(SRC:.cpp=.o)
all: $(TARGET)
clean:
@rm -rf $(OBJ)
@rm -rf $(TARGET)
@echo "Cleaned..."
%.o: %.cpp $(HEADERS)
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(TARGET): $(OBJ)
$(CXX) $(CXXFLAGS) $^ -o $@```
What determines which system calls a program makes?
程序的源代码。 整个 程序包括所有链接在一起的编译源。包括您未明确指定的那些,最值得注意的是大多数系统调用将直接发起的 C 系统库。如果是 Ubuntu,那就是 glibc。当然,其他调用系统库函数的源也会间接影响系统调用。
Is it only the compiler
当然 不仅仅是 编译器,但它也负责其中一些间接调用。例如,如果您编写 new X
,那么编译器会生成对 malloc
的调用,其实现调用 sbrk
或 mmap
,其实现执行系统调用。
我是这样理解题中信息的:
- 您在真实 Windows 系统上的虚拟 Ubuntu 系统 (WSL) 中编译程序。 - 你 运行 Ubuntu (WSL) 在你真正的 Windows 系统上的 docker 容器中。
- 在这个虚拟 Ubuntu (WSL) 中,您 运行 Multi2Sim 应该模拟 Linux ABI。
根据文档,系统调用的模拟似乎不完整。请参阅
中的2.3 编译和模拟您自己的源代码部分
http://www.multi2sim.org/downloads/m2s-guide-4.2.pdf,
系统调用 getdents64()
与 getdents()
不是关于 64 位处理器架构,而是关于内核对大型文件系统的支持。
引用 https://man7.org/linux/man-pages/man2/getdents64.2.html :
Library support for getdents64() was added in glibc 2.30
使用旧版本的 glibc
库编译和静态 link 您的程序可能会有所帮助。
所以我有一个 C/C++ 程序,它不 运行 某个计算机系统模拟器,因为它进行的系统调用未在该模拟器中实现。现在我想知道是什么决定了程序进行的系统调用。它只是编译器吗?或做 OS 之类的事情,硬件也发挥作用。模拟器在 ubuntu 14.04 上进行了测试,所以我想知道在 ubuntu 14.04 系统上编译程序是否会产生程序发出的不同系统调用?
一些上下文信息:
我自己的电脑是 运行ning Windows 10(64 位),我正在使用 wsl 终端在 VS 代码中编译程序。我想 运行 在名为 Multi2Sim 的计算机系统模拟器上运行此程序。我 运行 在我的 windows 计算机上的 docker 容器中安装这个模拟器。当在 docker 集装箱码头 运行ning lsb_release -a
时,它产生 ubuntu 14.04
。该程序不在模拟器上 运行,因为它进行了系统调用 getdents64(),但尚未在模拟器中实现。
模拟器在 ubuntu 14.04 上进行了测试,所以我在想如果我在那个 os 上编译它可能会改变系统调用。我使用了 -m32
标志,因为模拟器不支持 64 位 ELF 文件。
一些输出显示了运行正在使用的编译器等版本:
当 运行ning uname -a
在容器中时,我得到:
Linux 66510ea7ce2e 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
g++ --version
在我的 windows 计算机上的 wsl 终端:
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
g++ -dumpmachine
在我的 windows 计算机上的 wsl 终端:
x86_64-linux-gnu
生成文件:
TARGET = bandwidth
.PHONY: all clean $(TARGET)
# directories
INC_DIR = ../include
KERN_DIR = ../kernels
CMN_DIR = ../common
OBJ_DIR = obj
# compiler flags
CXX = g++
CXXFLAGS = -m32 -O3 -fopenmp -march=native -I$(INC_DIR) -std=c++14 $(USER_DEFS)
# header files
HEADERS = $(wildcard $(INC_DIR)/*.h)
# src files
SRC = $(wildcard *.cpp) $(wildcard $(KERN_DIR)/*.cpp) $(wildcard $(CMN_DIR)/*.cpp)
# object files
OBJ = $(SRC:.cpp=.o)
all: $(TARGET)
clean:
@rm -rf $(OBJ)
@rm -rf $(TARGET)
@echo "Cleaned..."
%.o: %.cpp $(HEADERS)
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(TARGET): $(OBJ)
$(CXX) $(CXXFLAGS) $^ -o $@```
What determines which system calls a program makes?
程序的源代码。 整个 程序包括所有链接在一起的编译源。包括您未明确指定的那些,最值得注意的是大多数系统调用将直接发起的 C 系统库。如果是 Ubuntu,那就是 glibc。当然,其他调用系统库函数的源也会间接影响系统调用。
Is it only the compiler
当然 不仅仅是 编译器,但它也负责其中一些间接调用。例如,如果您编写 new X
,那么编译器会生成对 malloc
的调用,其实现调用 sbrk
或 mmap
,其实现执行系统调用。
我是这样理解题中信息的:
- 您在真实 Windows 系统上的虚拟 Ubuntu 系统 (WSL) 中编译程序。 - 你 运行 Ubuntu (WSL) 在你真正的 Windows 系统上的 docker 容器中。
- 在这个虚拟 Ubuntu (WSL) 中,您 运行 Multi2Sim 应该模拟 Linux ABI。
根据文档,系统调用的模拟似乎不完整。请参阅
中的2.3 编译和模拟您自己的源代码部分
http://www.multi2sim.org/downloads/m2s-guide-4.2.pdf,
系统调用 getdents64()
与 getdents()
不是关于 64 位处理器架构,而是关于内核对大型文件系统的支持。
引用 https://man7.org/linux/man-pages/man2/getdents64.2.html :
Library support for getdents64() was added in glibc 2.30
使用旧版本的 glibc
库编译和静态 link 您的程序可能会有所帮助。