virtual-address-space相关内容

为什么 32 位操作系统支持 4 GB RAM?

只是阅读 purdue 关于操作系统的讲座中的一些笔记,它说: 程序将内存视为一个数组从地址 0 到 2^32-1(0 到4GB-1) 为什么是 4 GB? 解决方案 因为 32 位能够表示最大为 232 - 1 = 4294967295 = 4 GiB - 1 的数字,因此地址可达232 个单独的字节,然后是 4 GiB. 不过,有一些方法可以规避这一点.例如,使用 P ..
发布时间:2022-01-11 22:59:40 其他开发

不同进程的相同虚拟地址如何映射到不同的物理地址

我参加了有关操作系统设计和概念的课程,现在我正在尝试彻底研究 Linux 内核.我有一个无法摆脱的问题.在现代操作系统中,每个进程都有自己的虚拟地址空间 (VAS)(例如,32 位系统中的 0 到 2^32-1).这提供了许多优点.但在实施中,我在某些方面感到困惑.我举个例子来解释一下: 假设我们有两个进程 p1、p2;p1 和 p2 有自己的 VAS.一个地址0x023f4a54映射到不同 ..
发布时间:2022-01-04 22:40:47 其他开发

remap_pfn_range 如何将内核内存重新映射到用户空间?

remap_pfn_range 函数(用于驱动程序中的mmap 调用)可用于将内核内存映射到用户空间.它是如何完成的?谁能解释一下具体的步骤?内核模式是特权模式(PM),而用户空间是非特权模式(NPM).在 PM CPU 中可以访问所有内存,而在 NPM 中一些内存是受限的 - CPU 无法访问.当 remap_pfn_range 被调用时,那个仅限于 PM 的内存范围现在如何可供用户空间访问? ..

Linux中是否有用于从虚拟地址确定物理地址的API?

Linux 操作系统中是否有用于从虚拟地址确定物理地址的 API? 解决方案 内核和用户空间使用由内存管理硬件映射到物理地址的虚拟地址(也称为线性地址).此映射由页表定义,由操作系统设置. DMA 设备使用总线地址.在 i386 PC 上,总线地址与物理地址相同,但其他体系结构可能具有特殊的地址映射硬件来将总线地址转换为物理地址. 在 Linux 中,您可以使用 asm/io. ..

执行子进程时,操作系统将 argv 和 argc 存储在哪里?

我在理解操作系统如何将数据从父进程的地址空间传递到子进程的地址空间时遇到了一些困难.即,在 C 程序中,argc 和 argv 在传入 main 时存储在哪里? 我理解 argv 本质上是一个双指针.我不明白的是操作系统在将这些值加载到内核中后对它们做了什么.在为子进程创建地址空间后,它是否将这些值推送到新空间的堆栈上?我们显然不想传递指向另一个地址空间的指针. 为了记录,我正在使用 ..

了解虚拟地址和虚拟地址空间

我读到,“当程序执行像:MOV REG,1000 这样的指令时,它会将内存地址 1000 的内容复制到 REG.可以使用索引生成地址,基址寄存器、段寄存器等方式. 这些程序产生的地址称为虚拟地址,构成虚拟地址空间." 谁能解释一下,(这些程序生成的地址被称为虚拟地址)是什么意思? 解决方案 程序和数据以数字形式存储在内存单元中.每个存储单元都有一个唯一编号,称为地址.代表有效地 ..

进程的页表是否映射到内核地址空间?

我在做 Windows 系统编程,想知道是否可以在源代码级别访问进程的页表. 这是我所知道的与虚拟内存相关的页表. 假设用户只是在 Windows 操作系统(32 位)上运行一个名为“A"的进程. 首先,操作系统为 A 进程创建并维护了 4GB 的虚拟地址空间. (其中2GB是内核地址空间,另外2GB是用户地址空间. 用户地址空间中的任何代码都不能直接访问内核地址空间 ..

Windows x64's 44 位虚拟内存地址限制的背后

http://www.alex-ionescu.com/?p=50. 我阅读了上面的帖子.作者通过单链表示例解释了为什么 Windows x64 仅支持 44 位虚拟内存地址. struct {//8 字节头超长深度:16;ULONGLONG 序列:9;ULONGLONG NextEntry:39;标题8; 第一个牺牲是减少序列的空间number 为 9 位而不是 16 位,减少最大序列 ..

x86-64:规范地址和实际可用范围

Intel和AMD文档说,对于64位模式,实际上只有48位可用于虚拟地址,并且从48到63的位必须复制第47位(符号扩展).据我所知,目前所有的CPU都是以这种方式实现的,但是从理论上讲,没有任何事情可以扩展以后的实现中的可用空间(这不会破坏二进制兼容性). 是否存在一种标准方式以编程方式确定有意义的位数? (即某些特定的CPUID,就像物理地址一样). 我知道实际上48位对于任何合理 ..
发布时间:2020-07-13 22:14:14 其他开发

x86-64规范地址?

在阅读英特尔手册时,我遇到以下问题: 在支持Intel 64体系结构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须分别包含规范地址. 什么是“规范地址"? 解决方案 我建议您下载答案在第3.3.7.1节.该部分的第一行指出 在64位模式下,如果将微体系结构的地址位63到最高有效位设置为全1或全0,则认为该地址为规范形式. ..

在处理器x86/x86_64中使用物理或虚拟寻址在L1,L2和L3中进行缓存吗?

在处理器x86/x86_64中使用哪个寻址在L1,L2和L3(LLC)中进行缓存-物理或虚拟(使用PT/PTE和在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间有区别吗? 简短答案-英特尔使用经过虚拟索引,经过物理标记的(VIPT)L1高速缓存: L1-虚拟寻址(在8-way缓存中用于定义Set是必需的,在12 bits低要求是 L2-物理寻址(需要访问Virt-2-Phys的T ..
发布时间:2020-07-11 02:05:29 其他开发

为什么ELF执行入口虚拟地址的格式为0x80xxxxx,而不是零0x0?

执行后,程序将从虚拟地址0x80482c0开始运行.该地址不是指向我们的main()过程,而是指向由链接程序创建的名为_start的过程. 到目前为止,我对Google的研究只是让我想到了一些(模糊的)历史推测,例如: 在* NIX的端口上,有一个传说传说0x08048000曾经是STACK_TOP(也就是说,堆栈从接近0x08048000朝0向下增长)到i386,这是一组来自加利福尼 ..
发布时间:2020-05-28 21:00:36 其他开发

虚拟内存概念

我对一些有关虚拟内存的话题感到困惑.因此,我将逐点列出它们并提出问题.在回答时,如果您也列出一些我可以消除疑问的资料,我将更愿意.我将参考Linux elf可执行文件进行讨论. 我听说在32位系统中,每个进程的地址空间均为4gb.当我检查了我的可执行可重定位文件之一的objdump时,我看到它的限制从00000000到ffffffff.它还包含内核空间.这是文件的地址空间. 这是我们所说的虚 ..

了解虚拟地址,虚拟内存和分页

我一直在学习这些主题,阅读了许多文章和书籍,但是它们都缺少一些补充信息,使我更加困惑.因此,在这里,我想解释我在问问题时所知道的.希望这个话题对像我这样的许多人有用.如有必要,我还想了解我的知识和更正的有效性. 虚拟内存 一些文章说:“虚拟内存是硬盘的一些空间,可以模拟物理内存,因此我们可以拥有比实际更多的内存."其他一些文章说:“虚拟内存是物理内存(RAM)的组合,它是硬盘的一部分, ..
发布时间:2020-05-23 20:53:45 其他开发

多级页表-分层分页

过去的操作系统最终版本中的示例问题,我该如何计算这种问题? 计算机具有64位虚拟地址空间和2048字节的页面.页表项占用4个字节.使用多级页面表是因为每个表必须包含在一个页面中.需要多少级? 我将如何计算? 解决方案 由于页表必须适合页面,因此页表大小为2048字节,每个条目为4字节,因此表可容纳2048/4 = 512个条目.要寻址512个条目,它需要log2(512)= 9 ..
发布时间:2020-05-21 19:01:39 其他开发

mmap地址提示的合理有效起始地址,以确保一切正常

在我们的一项任务中,我们需要在两台机器之间建立一个分布式共享内存,我使用的是基于分页的技术,因此两台机器上的基址是不同的.但是有一个链表测试用例几乎要求两个地址范围都相同.使用MAP_FIXED的mmap的固定地址会导致从属机器崩溃(因为答复服务器线程的堆栈已被覆盖),我认为在两个进程的初始化期间创建一个保证在开始时都是免费的地址是合理的.但是,经过数小时的网上搜索之后,我仍然很遗憾没有找到该默认 ..
发布时间:2020-05-09 23:55:15 其他开发

当Windows可以访问的总内存也限制为4GB时,Windows如何为每个进程分配4GB的地址空间

Windows如何为多个进程分别提供4GB的地址空间 当它可以访问的总内存也限制为4GB时. 我在Windows内存管理中找到上述问题的解决方案 (由Pankaj Garg撰写) 解决方案: 要实现此目的,Windows使用了x86处理器(386和 以上)称为分页.分页允许软件使用其他 内存地址(称为逻辑地址)比物理内存 地址.处理器的分页单元将此逻辑地址转换为 物理地址是透明的 ..

了解虚拟地址和虚拟地址空间

我读到,“当程序执行诸如MOV REG,1000之类的指令时,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式来生成地址. 这些程序生成的地址称为虚拟地址,并形成虚拟地址空间." 任何人都可以解释一下,这是什么意思(这些程序生成的地址称为虚拟地址)是什么意思? 解决方案 程序和数据以数字形式存储在存储单元中.每个存储单元都有一个唯一的编号, ..

Windows为什么要为其系统地址空间保留1 Gb(或2 Gb)?

众所周知,Windows应用程序通常在32位系统上具有2Gb的专用地址空间.可以使用/3Gb开关将该空间扩展到3Gb. 操作系统会自行保留剩余的4Gb. 我的问题是为什么? 以内核模式运行的代码(即设备驱动程序代码)具有自己的地址空间.为什么在唯一的4Gb地址空间之上,操作系统仍要为每个用户模式进程保留2Gb? 我认为原因是用户模式和内核模式调用之间的过渡.例如,对NtWr ..

为什么32位操作系统支持4 GB的RAM?

只需阅读关于OS的纯正课程中的一些笔记 a>,它说: 程序将内存视为数组 从地址0到2 ^ 32-1(0到 4GB-1) 为什么要使用4 GB? 解决方案 因为32位能够表示最多2 32 的数字-1 = 4294967295 = 4 GiB-1并因此寻址到2 32 个单独的字节,则为4 GiB. 不过,有一些方法可以避免这种情况.例如,即使使用32位操作系统,也可以使用 ..
发布时间:2020-05-08 19:01:49 其他开发