virtual-memory相关内容
我正在尝试编写自己的操作系统,到了需要设置分页的时候。我编写了一些代码,这些代码似乎可以工作,但我意识到我不理解分页是如何工作的。现在我会试着解释我是如何理解事情的,我会有几个问题! 据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储了1024个4字节的条目,每个条目都包含指向页表的指针,页表也有1024个条目。页表的每
..
我在教科书中读到堆栈通过减少内存地址而增长;即从高地址到低地址.这可能是一个糟糕的问题,但我没有正确理解这个概念.你能解释一下吗? 解决方案 首先,它依赖于平台.在某些架构中,堆栈是从地址空间的底部开始分配并向上增长的. 假设像 x86 这样的架构从地址空间的顶部向下堆栈,这个想法很简单: =============== 最高地址(例如 0xFFFF)|||堆栈 ||||-----
..
在以下情况下,顺序写入和随机写入有什么区别:-1)基于磁盘的系统2)基于SSD [Flash Device]的系统 当应用程序写入一些东西并且需要在磁盘上修改信息/数据时,我们如何知道它是顺序写入还是随机写入.到目前为止,写入无法区分为“顺序"或“随机".写入只是缓冲,然后在我们刷新缓冲区时应用到磁盘. 如果我错了,请纠正我. 解决方案 当人们谈论 sequential 与 r
..
我熟悉 MIPS 架构,它有一个软件管理的 TLB.因此,您(操作系统)想要存储页表和页表条目的方式和位置完全取决于您.例如,我做了一个带有单个倒置页表的项目;我看到其他人在每个进程中使用 2 级页表. 但是 x86 的故事是什么?据我所知,TLB 是硬件管理的.x86 是否告诉您,“嘿,这是您当前使用的页表条目需要去的地方 [物理地址范围]"?但是等等,我一直认为 x86 使用多级页表,所
..
我对操作系统中的物理/逻辑/虚拟地址这些术语有些困惑(我使用 Linux-open SUSE) 这是我的理解: 物理地址-当处理器处于系统模式时,处理器使用的地址是物理地址. 逻辑地址-当处理器处于用户模式时,使用的地址是逻辑地址.这些无论如何都会通过添加带有偏移值的基址寄存器映射到某个物理地址.它在某种程度上提供了一种内存保护. 我曾经讨论过虚拟地址和逻辑地址/地址空
..
我熟悉 MIPS 架构,它有一个软件管理的 TLB.因此,您(操作系统)希望如何以及在何处存储页表和页表条目完全取决于您.例如,我做了一个带有单个倒页表的项目;我看到其他人在每个进程中使用 2 级页表. 但是 x86 的故事是什么?据我所知,TLB 是硬件管理的.x86 是否告诉您,“嘿,这是您当前使用的页表条目需要去[物理地址范围] 的地方"?但是等等,我一直认为 x86 使用多级页表,所
..
我正在编写一个 Linux 内核模块,我想分配一个可执行页面.普通的 kmalloc() 在不可执行的页面中返回一个指针,在那里执行代码时我会遇到内核恐慌.它必须在 Ubuntu Karmic x86、2.6.31-20-generic-pae 上运行. 解决方案 #include #include ...char *p = __vmalloc(byte_size, GFP_KERNEL,
..
我有现有代码,它采用 struct page * 列表并构建描述符表以与设备共享内存.该代码的上层目前期望使用 vmalloc 或用户空间分配缓冲区,并使用 vmalloc_to_page 获取对应的struct page *. 现在上层需要处理各种内存,而不仅仅是通过vmalloc获得的内存.这可能是使用 kmalloc 获得的缓冲区、内核线程堆栈内的指针或其他我不知道的情况.我唯一的保证
..
在理解 highmem 需要处理超过 1GB 的 RAM 时,我遗漏了一些东西.有人能指出我哪里出错了吗?谢谢! 我所知道的: 进程的 1 GB 虚拟内存(高内存区域)是为内核操作保留的.用户空间可以使用剩余的 3 GB.这是 3/1 分割. VM 的虚拟内存功能将(连续)虚拟内存页面映射到物理页面 (RAM). 我不知道的: 哪些操作使用内核虚拟内存?我想像内核空间
..
我对操作系统中的物理/逻辑/虚拟地址这两个术语有点困惑(我使用 Linux-open SUSE) 以下是我的理解: 物理地址- 当处理器处于系统模式时,处理器使用的地址是物理地址. 逻辑地址——当处理器处于用户模式时,使用的地址是逻辑地址.这些无论如何都通过添加具有偏移值的基址寄存器映射到某个物理地址.它在某种程度上提供了一种内存保护. 我遇到过关于虚拟和逻辑地址/地址
..
我在教科书中读到堆栈通过减少内存地址而增长;即从高地址到低地址.这可能是一个糟糕的问题,但我没有理解正确的概念.你能解释一下吗? 解决方案 首先,它依赖于平台.在某些架构中,栈是从地址空间的底部开始分配并向上增长. 假设像 x86 这样的架构从地址空间的顶部向下堆栈,这个想法非常简单: ================ 最高地址(例如 0xFFFF)|||堆栈 ||||------
..
我经常对操作系统中的虚拟化概念感到困惑.将 RAM 视为物理内存,为什么我们需要虚拟内存来执行进程? 当来自外部硬盘的进程(程序)被带到主内存(物理内存)执行时,这个虚拟内存在哪里. 谁来管理虚拟内存,虚拟内存的大小是多少? 假设 RAM 的大小为 4GB(即 2^32-1 个地址空间),虚拟内存的大小是多少? 解决方案 除其他外,虚拟内存是一种抽象,让程序员产生一种错觉
..
好的,我有一个菜鸟学生的问题. 所以我很熟悉堆栈包含子程序调用,堆包含可变长度数据结构,全局静态变量被分配到永久内存位置的事实. 但在较不理论的层面上,这一切是如何运作的? 编译器是否只是假设它有一个完整的内存区域,从地址 0 到地址无穷大?然后就开始分配东西? 它在哪里布局指令、堆栈和堆?在内存区域的顶部,内存区域的末尾? 这如何与虚拟内存一起工作?虚拟内存对程序透
..
在“低级编程:英特尔® 64 位架构上的 C、汇编和程序执行"一书中,我读到: 每个虚拟 64 位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有 48 位宽的;它被符号扩展为 64 位规范地址.它的特点是它的左17位是相等的.如果条件是不满意,地址在使用时立即被拒绝.然后48 位虚拟地址转换为 52 位物理地址在特殊表的帮助下寻址. 为什么虚拟地址和物理地址相差
..
我在 Linux 下运行 Java 应用程序时遇到问题. 当我使用默认的最大堆大小 (64 MB) 启动应用程序时,我看到使用 tops 应用程序为应用程序分配了 240 MB 的虚拟内存.这会导致计算机上的一些其他软件出现一些问题,而这些软件相对资源有限. 保留的虚拟内存无论如何都不会被使用,据我所知,因为一旦我们达到堆限制,就会抛出一个OutOfMemoryError.我在wind
..
在我们的生产机器上运行一个简单的 Java 程序,我注意到这个程序消耗了更多 10G 的 virt.我知道虚拟内存不是那么重要,但至少我想了解为什么需要它. public class Main {公共静态无效主(字符串 [] args){System.out.println("Hello World!");尝试 {线程睡眠(10000);} catch(InterruptedException
..
malloc() 失败的原因是什么,尤其是在 64 位中? 我的具体问题是试图在 64 位系统上分配一个巨大的 10GB 内存块.这台机器有 12GB 的 RAM 和 32GB 的交换空间.是的,malloc 是极端的,但为什么会出现问题呢?这是在带有 Intel 和 MSFT 编译器的 Windows XP64 中.malloc 有时成功,有时不成功,大约 50%.8GB mallocs
..
根据架构概览文档 Aarch64 支持 4k 和 64k 页面.一些 CPU 还支持 16k 页.查看地址转换方案的详细信息,我得出的结论是,此类 CPU 不支持同时存在不同大小的页面(与 x86_64 不同,它允许这样做).我说得对吗? 解决方案 您将两种不同但相关的事物混为一谈 - 页面大小与粒度. 在 AArch64 中,您有 3 种可能的翻译粒度可供选择,每一种都会产生一组不
..
ARM720T 用户手册提到了小页面和大页面.既然 ARM 720T 需要一个 64KB 的页表条目在页表中复制 16 次,为什么不放置 16 个小页 (4KB) 条目来模拟 64KB 的页条目,而不是首先使用大页? 解决方案 来自 ARM720 TRM, 大页面由 64KB 内存块组成.大页面是支持允许映射大范围的内存中只使用一个条目TLB).扩展了额外的访问控制机制到 16KB
..
根据架构概览文档 Aarch64 支持 4k 和 64k 页面.一些 CPU 还支持 16k 页.查看地址转换方案的详细信息,我得出的结论是,此类 CPU 不支持同时存在不同大小的页面(与 x86_64 不同,它允许这样做).我说得对吗? 解决方案 您将两种不同但相关的事物混为一谈 - 页面大小与粒度. 在 AArch64 中,您有 3 种可能的翻译粒度可供选择,每一种都会产生一组不
..