【问题标题】:Understanding memory mapping了解内存映射
【发布时间】:2016-08-26 16:14:34
【问题描述】:

在现代 PC 中,将在哪里

MOV [0x0000], 7

放一个7?它是我的 RAM 的第一个字节,还是进程地址空间的第一个字节?假设它触发了内存冲突。

【问题讨论】:

  • 如果它触发了内存冲突,那么它如何将值放入该地址?
  • 你的意思是假设它不会触发访问冲突?
  • 是否处于保护模式?正在运行什么操作系统,或者您是否处于具有自己引导扇区的实模式??

标签: memory assembly x86 virtual paging


【解决方案1】:

你的意思是假设它不会触发访问冲突?每个进程都有自己的virtual address space。前 64kiB 通常保持未映射,因此 NULL 指针访问实际上会产生噪音,而不是让程序默默地做坏事。

在典型操作系统上的用户空间进程中,0 的绝对地址确实指的是进程虚拟地址空间的第一个字节。

启用分页后,内核甚至无法直接使用物理地址。要写入给定的物理地址,必须创建一个页表条目,将该物理页映射到虚拟页(或查找现有映射),invlpg 以确保 TLB 没有缓存过时的条目,然后使用那个虚拟地址。

【讨论】:

    【解决方案2】:

    这取决于系统架构。每个架构都提供指令集和内存布局。此外,这取决于您使用的操作系统。例如。实时操作系统通常不提供虚拟内存。

    问候

    【讨论】:

    • 我的 windows 8.1 / Ubuntu Linux 更可能使用什么?在这些操作系统中运行上述 MOV 的结果是什么?
    • Win 或 Linux 等操作系统使用虚拟地址空间,这意味着它不是真正的物理地址。上面的指令看起来像一个操纵 CPU 寄存器集的机器指令。 support.amd.com/TechDocs/24594.pdf(第 217 页)
    猜你喜欢
    • 2019-04-26
    • 2014-06-04
    • 2017-03-25
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2015-08-09
    • 2011-09-21
    相关资源
    最近更新 更多