我正在学习操作系统,并试图深入了解程序如何工作的基础知识。
我有一个简单的C++程序
当我查看Linux的基本架构时,它总是显示用户空间和内核空间,操作系统通过设备驱动程序访问硬件。
因此,如果我没有弄错的话,我创建的任何程序都需要访问操作系统的每条指令,特别是当它在用户空间中运行时?
但后来我在另一个网站上看到了这个答案: https://cseduators.stackexchange.com/a/3463/14110
其中提到纯粹计算的东西不会进行系统调用,但是它们如何访问CPU、RAM等?
我的基本理解告诉我,一切都应该进行系统调用,但现在我看到足够的信息,并非一切都是系统调用,那么基本算术或任何其他不是系统调用的指令如何工作?
我知道我不会涉及太多较低级别的细节。但简而言之,这是如何工作的 请问有人可以解释一下吗?
这是我根据我的想法创建的图表,请随时更正:
这是一个简单的 C++ 程序,它在内存中创建三个变量, 以两个数字作为输入, 将两个数字相加并将值放入第三个数字中,然后显示输出:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, char const *argv[])
{
int x, y, z; // Create three variables and store them in memory, should make a system call
printf("Enter first number: "); // Ask for User Input, I/O
cin >> x; // I/O operation
printf("Enter second number: ");
cin >> y;
z = x + y;
printf("Total: %d \n", z);
return 0;
}
这些指令不是都需要隐式或显式的系统调用吗?
我阅读了相关问题,
程序运行完美,但我想了解系统调用
内核为您分配虚拟内存块(页)(通过系统调用)。一旦内核为您提供了该页面,您就可以在该页面内自由执行您喜欢的任何操作。数学运算只需要访问内存和寄存器即可执行,内核在执行此类运算时不涉及用户空间代码。与内存一样,程序可以自由使用它需要的任何指令(只要它保留在分配的内存页内)。
在某些时候,内核会希望另一个进程运行,当它这样做时,它会中断该进程,保存其寄存器并恢复另一个进程。不过,这对于用户空间代码来说基本上是透明的,当内核恢复其寄存器并恢复执行时,它的执行将从中断处继续。
仅在访问计算机中的其他硬件(如 GPU、网卡、存储等)时才需要系统调用。