c++ - 在 C/C++ 或任何其他此类语言中将 & 符号应用于变量或数据类型时返回什么类型的地址?

标签 c++ c memory-management operating-system

这是一个非常基本的问题,自从我在我的操作系统课上听说虚拟内存和物理内存概念的那一天起就一直困扰着我。现在我知道在加载时和编译时,虚拟地址和逻辑地址绑定(bind)方案是相同的,但在执行时它们不同。

首先,为什么在编译和加载时生成虚拟地址是有益的,以及当我们应用 & 运算符获取变量地址、原始数据类型、用户定义类型和函数定义地址时返回什么?

操作系统如何准确地将虚拟地址映射到物理地址?这些问题是出于好奇而提出的,考虑到现代操作系统,我会喜欢一些好的和深刻的见解,早期操作系统的情况如何。我只是特定于 C/C++,因为我对其他语言了解不多。

最佳答案

物理地址出现在硬件中,而不是软件中。操作系统内核中可能/偶尔出现异常。物理意味着它是系统总线和 RAM 芯片看到的地址。

不仅物理地址对软件无用,而且可能是一个安全问题。能够在不进行地址转换的情况下访问任何物理内存,并且知道其他进程的地址,将允许不受限制地访问机器。

也就是说,小型或嵌入式机器可能没有虚拟内存,而一些较旧的操作系统确实允许共享库指定其最终物理内存位置。此类政策会损害安全性并且已经过时。

关于c++ - 在 C/C++ 或任何其他此类语言中将 & 符号应用于变量或数据类型时返回什么类型的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15654374/

相关文章:

C++ 模板元编程特化歧义

android - 如何通过我的 PC 终端在我的 android 设备上编译和运行 C 程序。?

c - Mem 分配器方法的无效转换 (C)

java - 用Java计算对象的大小

c - C语言编程中的插入排序

c++ - 如何在多个类中使用友元函数

c++ - 在 C++ 中连接 C 字符串的更优雅的方法?

c++ - 如何使模板函数成为模板类的 friend

c - 如何理解段错误?

C - 如何释放在其节点中具有链表的链表?