gpt4 book ai didi

c - 在 C 中取消引用较低级别的指针

转载 作者:行者123 更新时间:2023-12-04 10:36:33 25 4
gpt4 key购买 nike

当malloc返回一个指针(一个数据 block 的虚拟地址)时,

char *p = malloc (10);

p 有一个虚拟地址,(比如 x)。而 p 保存了一个由 10 个地址组成的 block 的虚拟地址。假设这些虚拟地址是从 y 到 y+10。

这10个地址属于一个页,虚拟-->物理映射放在页表中。

当处理器取消引用指针 p 时,比如 printf("%c", *p); ,处理器如何知道它必须访问 y 处的地址> ?

页表是否被访问两次以取消对指针的引用,换句话说 - 打印 p 指向的地址?具体是怎么做到的,谁能解释一下?

此外,为了访问堆栈变量,处理器是否必须通过页表访问它?堆栈指针寄存器 (SP) 不是已经指向堆栈了吗?

最佳答案

我认为存在不同层次的混淆。

首先,页表:这是一种数据结构,它使用一些内存来提供指向更多内存的指针。给定一个特定的虚拟地址,它可以将其解构为表中的索引。现在,这是在内核的掩护下发生的,但可以在用户空间中实现同样的想法。

现在,下一步是流程。每个进程都有自己的内存 View ,因此有自己的一组页表。处理器如何知道这些不同页表所在的位置?在一个名为 cr3 的特殊控制寄存器中。更改进程有时称为上下文切换;这是正确的,因为设置 cr3 会改变虚拟内存的进程 View 。

但下一个问题是,处理器是如何理解虚拟内存的概念的呢?好吧,在一些较旧的体系结构中(想到 MIP),系统会保留最近翻译的内存缓存,并提供有关如何处理虚拟内存访问的指导。在 x86 中,缓存(通常称为转换后备缓冲区)实际上是在硬件中实现的。处理器存储这些翻译,以便它可以自动处理页表查找。如果存在缓存未命中,那么它实际上将遍历操作系统设置的页表结构以查找它应该引用的内容。

当然,这意味着处理器必须至少有两种不同的模式:一种假设地址是直接的,另一种遍历页表。第一种模式,实模式,在引导时就存在,并且只需要足够长的时间来设置表,然后引导加载程序打开虚拟模式并跳转到其余模式的开头的代码。


对我的长解释的简短回答是,很可能根本没有访问页表,因为处理器已经有了地址转换。

关于c - 在 C 中取消引用较低级别的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com