我对内存管理和分页的看法是否正确?

时间:2014-09-29 13:03:49

标签: c memory-management operating-system kernel

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

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

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

  • 使用" end"找出内存的高位开始的位置。我的链接器脚本中定义的标记。我应该得到一个数字,它是内存中的地址。此地址之前的所有内容都是内核所需的内存,其后的所有内容都是可用空间。

  • 使用该数字创建一个可用于处理该内存地址的指针变量。在存储器地址处,指针指向I,以定义双向链表。该列表将包含可用于指向每个"页面的数字(表示内存地址和每4K的偏移量)。在系统内存中,以及告诉系统该页面是分配还是免费的东西。

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

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

要设置分页,我必须创建一个页面目录(在第一页?)和1024页页面包含1024页。然后我将页面目录的地址放在Cr3寄存器中,并更改Cr0寄存器中的一个位。此时,我还需要新功能来分配和释放页面目录中的页面。

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

1 个答案:

答案 0 :(得分:1)

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