【问题标题】:Are my thoughts about memory management and paging correct?我对内存管理和分页的想法是否正确?
【发布时间】:2014-11-23 21:20:51
【问题描述】:

我正在尝试编写自己的操作系统,并且已经到了必须考虑内存管理和分页的地步。这表明它比我预期的更具挑战性。 :-D 在我尝试另一个失败的实现之前,我想按顺序思考一下这个主题。

据我了解,为了在 32 位 x86 系统上用 C 语言正确实现分页,我应该:

创建一个内存管理器我...

  • 使用我的链接描述文件中定义的“结束”标签找出内存的高部分从哪里开始。我应该得到一个数字,它是内存中的地址。此地址之前的所有内容都是内核所需的内存,之后的所有内容都是空闲空间。

  • 使用该数字创建一个指针变量,我可以使用它来处理该内存地址。在指针指向的内存地址处,我将定义一个双向链表。该列表将包含可用于指向系统内存中每个“页面”的数字(表示内存地址,以及每 4K 的偏移量),以及告诉系统该页面是已分配还是空闲的信息。

    李>
  • 当我希望内存管理器分配一个页面时,我需要一个函数来遍历列表,直到找到一个空闲的 4K 页面,将其标记为已分配,并返回可以使用的数字作为该页面的内存地址。

  • 为了释放一个页面,我有一个函数,它接受一个代表页面内存地址的数字,然后我遍历列表,直到找到具有该数字的元素,并将其标记为空闲。

要设置分页,我必须创建一个页面目录(在第一页?),以及包含 1024 个页面的 1024 个页表。然后我把页目录的地址放到Cr3寄存器中,在Cr0寄存器中稍作改动。此时我还需要新的函数来通过页面目录分配和释放页面。

我对这一切的看法正确吗?如果不是,我有什么不明白的?我需要做些什么来防止系统尝试访问不存在的内存?

【问题讨论】:

  • 我很想回答这个问题,但我不是。但是,如果您能够设法创建一个更小、更精确的问题,它可能对其他人有所帮助。就目前而言,这个问题的范围似乎相当大。
  • @Magnus Hoff:这是一个宽泛的问题,但我问的是整个过程。我已经阅读了我能找到的关于该主题的所有内容,在尝试应用该理论之前,我需要确保我理解了这个概念。
  • 在尝试另一个失败的实现之前,我建议您从几个现有的开源操作系统中收集和研究虚拟内存管理器的源代码。几个我的意思是找到并理解至少 3 个工作示例
  • @xmojmr:试过了,但谷歌让我失望了,OSDev wiki 已经过时了。如果您有任何示例,我将不胜感激一些链接。我已经能够找到一大堆教程和示例,这些操作系统将通过处理中断,但在谈论分页之前就退出了。大多数其他资源似乎都是理论而没有应用。一旦我对我需要做的什么有了深入的了解,那么编程对我来说就不会那么难了。一旦我能得到接近我需要的东西,我应该能够使用调试器来解决粗糙的部分。
  • @PatrickSanford 我的意思是研究源代码,而不仅仅是谈论它的文章。一些可以(?)进行虚拟内存管理的操作系统及其源代码包括:MenuetOSSingularityReactOSLinux,也许还有更多,我从我的记忆中回忆了几年前的记录记录,V2OS 没有实现它..

标签: c memory-management operating-system kernel


【解决方案1】:

您还需要编写页面错误异常处理程序并将其插入到您正在使用的任何处理器的中断表中。当存在 TLB 未命中时,此处理程序将通过页表执行搜索。每个进程都有自己的一组页表,将虚拟地址映射到物理地址。

【讨论】:

  • 甜蜜。那是中断 14?
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多