问题标签 [virtual-address-space]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - 不同进程的相同虚拟地址如何映射到不同的物理地址
我上了一门关于操作系统设计和概念的课程,现在我正在尝试彻底研究 Linux 内核。我有一个我无法摆脱的问题。在现代操作系统中,每个进程都有自己的虚拟地址空间(VAS)(例如,32 位系统中的 0 到 2^32-1)。这提供了许多优点。但在实施中,我在某些方面感到困惑。让我通过一个例子来解释它:
假设我们有两个进程 p1, p2; p1 和 p2 有自己的 VAS。一个地址0x023f4a54
映射到不同的物理地址(PA),怎么可能呢?这种翻译是怎么做到的。我的意思是我知道翻译机制,但我无法理解当涉及不同进程的地址空间时,相同的地址被映射到不同的物理地址。
windows - 从性能的角度来看,虚拟地址空间映射如何才能被接受?
这个问题针对任何使用 VAS 模型的操作系统,但我将指定 windows nt,因为这是我最了解的系统。
众所周知,默认情况下,32 位 Windows 上的进程自行获得 2 GB 内存。该内存可以位于系统内存、交换文件、USB 驱动器等中。
这意味着多个进程可以在地址 0x12345678 处分配内存,但是这当然不可能映射到相同的物理内存。
我的问题是,如何在不完全破坏性能的情况下做到这一点?处理器是否有某种机制来映射内存地址?
每次我们不想访问内存时都要求操作系统进行地图查找,看起来很慢..
windows - Windows x64 的 44 位虚拟内存地址限制背后
http://www.alex-ionescu.com/?p=50。
我读了上面的帖子。作者通过单链表示例解释了为什么 Windows x64 只支持 44 位虚拟内存地址。
首先要做的牺牲是将序列号的空间减少到 9 位而不是 16 位,从而减少列表可以实现的最大序列号。这仍然只为指针留下了 39 位——对 32 位的改进是平庸的。通过在分配时强制结构为 16 字节对齐,可以再赢得 4 位,因为现在可以始终假定底部位为 0。
哦,我无法理解。
什么“通过在分配时强制结构为 16 字节对齐,可以再赢得 4 位,因为现在可以始终假定底部位为 0。” 方法?
linux - 在 linux sk_buff 中,skb->data 是物理地址还是虚拟地址?
我正在调查嵌入式系统的以太网驱动程序中的一些内存损坏问题。
我怀疑总线主控 DMA 控制器和慢速 SDRAM 之间存在问题。所以我想在快速 SRAM 中使用反弹缓冲区。为此,我需要做两件事:我必须将 SRAM 的物理地址(从总线主机的角度来看)放入 DMA 控制器缓冲区描述符中,并且一旦 DMA 控制器报告一个传入的数据包。
从阅读中我无法确定的内容
是 skb->data 是物理地址还是虚拟地址。即我应该打电话
或者
将数据包放入 sk_buff 以便 linux 网络堆栈的其余部分可以处理它?
编辑:这是有问题的驱动程序。我会说它正在将虚拟地址传递到 DMA 控制器寄存器中,因此无法工作,但我有一个可以使用此代码的 devkit。然而,我的 SDRAM 的时序不如 devkit DDR SDRAM 好,因此我正在考虑实现反弹缓冲区。
memory - 文件系统 - 内存映射文件
我的操作系统课程的最后一个示例问题:
大多数操作系统都支持“内存映射文件”;这描述了映射到正在运行的进程的地址空间的文件。对文件的读取和写入转换为内存读取和写入。我们可以想象存在两个新的系统调用,map() 和 unmap()。
a) 考虑 map();它接受文件名和虚拟地址,使操作系统将文件映射到从虚拟地址开始的地址空间。描述如何使用虚拟内存系统来支持这个调用。
b) 考虑 unmap();它将文件与虚拟地址空间分离。描述实现此系统调用应采用的统计信息。列出你所有的假设。
c) 在许多 UNIX 系统中,inode 保存在磁盘的开头。另一种设计是在创建文件时分配一个 inode,并将该 inode 放在文件第一个块的开头。讨论这种替代方案的利弊。
d) 如果包含空闲磁盘块信息的位图或空闲列表由于崩溃而完全丢失,会发生什么情况?无论如何要从这场灾难中恢复,还是磁盘不再可用。讨论您对 UNIX 和 FAT 样式的磁盘块分配的答案。
非常感谢有关这些问题的任何讨论信息。
operating-system - 多级页表——分层分页
来自过去操作系统决赛的示例问题,我如何计算这种问题?
一台计算机有一个 64 位的虚拟地址空间和 2048 字节的页面。页表条目占用 4 个字节。使用多级页表是因为每个表都必须包含在一个页中。需要多少级?
我将如何计算这个?
linux - 是否有任何 API 用于从 Linux 中的虚拟地址确定物理地址?
Linux操作系统中是否有任何API可以从虚拟地址中确定物理地址?
linux-kernel - linux进程地址空间中的最后一个GB是否映射到相同的物理内存?
我读到前 3 GB 是为进程保留的,最后一个 GB 是为内核保留的。我还读到内核是从物理地址空间的第 2 MB 开始加载的(取决于配置)。我的问题是,所有进程的最后 1 GB 的映射是否相同,并映射到该物理内存区域?
另一个问题是,当进程切换到内核模式时(例如,发生系统调用时),那么使用哪些页表,是进程页表还是内核页表?如果使用内核页表,则它们无法访问属于该进程的内存位置。如果是这样,那么内核虚拟内存显然没有用处,因为对内核代码和数据的所有访问都将通过最后 1 GB 进程地址空间的映射。请帮助我澄清这一点(任何有用的链接将不胜感激)
process - 在从/到用户空间到内核空间切换时如何使用 4gb(VM) 地址空间
我看了很多关于如何将进程地址空间划分为进程/内核的在线线程/教程
例如:我有一些 Helloworld 程序,我以 printf 的形式调用(反过来它会进行写入系统调用以进入内核空间)
我怀疑内核如何使用 Helloworld 程序堆栈。你能告诉我整个执行过程是如何进行的吗...
./helloworld -> printf() -> 写系统调用 -> 显示驱动 -> 从写返回 -> 返回 helloworld
谢谢,阿玛伦德
operating-system - 可变分区方案中的虚拟地址空间
我知道这个问题更多的是关于操作系统而不是编程,对此感到抱歉。
在具有可变分区的多程序方案中,谁必须决定进程虚拟地址空间的大小?
如果在执行过程中我们发现一个进程需要更多内存怎么办?
对于可变分区方案,我的意思是不涉及分段或分页而是计数分配的方案。