Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我们看到一个进程的虚拟地址(在分页系统中),这些虚拟地址存在于哪里?_Assembly_Operating System_Paging_Virtual Memory_Memory Segmentation - Fatal编程技术网

Assembly 我们看到一个进程的虚拟地址(在分页系统中),这些虚拟地址存在于哪里?

Assembly 我们看到一个进程的虚拟地址(在分页系统中),这些虚拟地址存在于哪里?,assembly,operating-system,paging,virtual-memory,memory-segmentation,Assembly,Operating System,Paging,Virtual Memory,Memory Segmentation,我们看到虚拟地址对应于任何指令,所以我的问题是这些虚拟地址存在于哪里?如果我们在gdb中看到反汇编,我们会看到虚拟地址,这些地址驻留在哪里?请不要说这是它必须通过页表映射到物理地址的唯一虚拟地址,我知道,但我们在gdb中看到的这些虚拟地址存在于何处?在RAM或硬盘中?虚拟地址的存在方式与街道地址的存在方式不同。只有街道地址引用的房屋才能存在,同样,虚拟地址引用的存储也可以(但不一定)存在。什么类型的存储取决于系统。通常它是RAM,但也可以是ROM、内存映射外设、开放总线(即无)或其他东西。CPU

我们看到虚拟地址对应于任何指令,所以我的问题是这些虚拟地址存在于哪里?如果我们在gdb中看到反汇编,我们会看到虚拟地址,这些地址驻留在哪里?请不要说这是它必须通过页表映射到物理地址的唯一虚拟地址,我知道,但我们在gdb中看到的这些虚拟地址存在于何处?在RAM或硬盘中?

虚拟地址的存在方式与街道地址的存在方式不同。只有街道地址引用的房屋才能存在,同样,虚拟地址引用的存储也可以(但不一定)存在。什么类型的存储取决于系统。通常它是RAM,但也可以是ROM、内存映射外设、开放总线(即无)或其他东西。

CPU寄存器、内存和任何其他存储器(包括磁盘)中可以存在地址(或任何其他数字值)。但这对你来说可能并不奇怪,你问的也不奇怪

如果我们讨论的是32位x86页转换,那么页表不包含经过转换为物理地址的虚拟地址。页表只包含物理地址,而不包含虚拟地址。不需要在页表中存储虚拟地址


让我们简化一下,假设系统只有一个页表,而这个页表包含1024个代码/数据页的物理地址。这里的虚拟地址在哪里?它们几乎是页面表中的索引。如果页面大小为4KB,且所有地址均为22位,则虚拟地址的12个低位指定代码/数据页面内的位置(0到4095),虚拟地址的10个高位通过页面表选择1024个页面中的一个。当CPU使用虚拟地址访问内存时,它会将虚拟地址分解为页表的索引和所选页内的偏移量。然后,它获取页面的物理地址(从页面表中),将页面内的偏移量添加到其中,然后在处使用生成的物理地址读或写内存。

相对于x86,回答您的问题的总体简化可能是:

如果发现指令指针(IP)与标记为“不存在”的页面中的虚拟内存地址关联,则会导致页面错误。页面错误处理程序将加载带有代码的空闲页面帧,将其映射到虚拟内存,标记虚拟页面存在,然后使用新加载的指令返回虚拟内存位置。将尝试执行该指令

如果指令访问引用不存在的虚拟内存地址的内存操作数,则它们也将导致额外的页面错误。页面错误将发生,页面处理程序将所需数据加载到空闲页面帧中,将其映射到虚拟内存,将虚拟页面标记为存在,然后返回导致错误的指令。此时将再次重试该指令


操作系统用来维护页面框架的确切机制;维护页面表和目录;决定从何处/如何加载数据/代码是不同的实现细节。关键是页面错误是将数据/代码加载到虚拟内存页面的主要机制,而虚拟内存页面可能已被操作系统标记为不存在。

我不明白你在问什么,这是关于“驻留”和“存在”的吗-你认为所有可能的地址都会有一个巨大的列表吗?@harold实际上我想知道虚拟地址的实际位置,它们是驻留在磁盘还是RAM中?无论你放在哪里。它们与其他类型的价值观没有太大区别。您可能会在寄存器、RAM中有一些指针,可能其中的一些RAM会被分页到磁盘。。这是个奇怪的问题。它与“数组索引驻留在何处”类似。@harold数组索引将驻留在主内存中,但我们看到虚拟地址对应的指令,如mov、store。这些带有虚拟地址的指令驻留在哪里,我们在gdb中看到的所有指令都有物理帧吗?哦,这就是你们的意思。你的问题真是令人费解。指令只是执行的数据。包含指令的典型页面也可以调出(内核中有些页面必须永久驻留),但它们通常是可执行文件的内存映射页面,因此它会被删除,因为它已经存在于磁盘上。这一伎俩并不是留给指导的。最后,这实际上与地址无关。@FUZxxi我们在gdb中看到指令,是所有指令都以物理方式存在,还是我们只是从磁盘和操作系统中看到,当前执行的指令存在页面错误(考虑不加载的情况,存储)。这是实现定义的。这些指令在某个时候被加载到RAM中,但它们可能已经被交换掉了。好的,但假设在0x80123456 mov reg1,reg2是我们在.text部分执行的第一条指令,0x80123456是否会出现页面错误,因为它是与0x80123虚拟页面对应的第一条指令或物理帧已加载到系统中?如果出现页面错误,那么我们如何看待mov reg1、reg2指令,因为没有为其分配物理帧,我们如何看待.text节指令而不实际加载它?@user156991如果您在内存中看到某些内容(代码或数据),这意味着相应的虚拟地址被映射到物理地址,并且在某个点上加载/写入了一些内容到底层物理内存。它可以由操作系统自动/按需完成,尤其是在内存映射文件时(页面错误会告诉操作系统映射和加载)。可以通过询问操作系统(通过系统调用)“手动”完成