内存寻址的具体设计

描述

本文的目的不是介绍内存寻址的具体设计,其实很多细节我也不了解,而是想通过内存寻址的设计思想看看对 FPGA 的设计有什么帮助和借鉴。

内存寻址有两个的重要的设计:

内存分页

页表分级

关于内存分页 - 规整即简单

内存分页即将内存分割为以页(一般是4KB)为单元的块,然后内存的分配和使用都是以页为最小单元。假如一个进程只需要 2KB 的内存,仍然给其分配 4KB(一页)的空间。

关于内存分页的好处,我觉得知乎上一位知友的描述非常生动和形象。他将内存分页比喻为停车场划分停车位。停车位的划分使得停车人寻找停车位时变得简单,停车人不再需要自己判断位置空间是否够大能停下车,只需要看有没有空位即可。同时也使停车位的使用管理变得高效,停车场管理人员可以很容易判断并发布停车位的空位信息。当然,这可能只是内存分页的好处中的其中一个。

我们可以总结一下内存分页的使用场景:

有一块大的 memory 空间

有很多 Users 要使用 memory

Users 使用 memory 的时间和空间大小不确定

那么当我们在 FPGA 设计中遇到这样类似的场景时,便可以借鉴内存分页的思想,将 memory 划分为不同的块,来提高 memory 的使用和管理效率。当然,对于 memory 块的划分可能导致 memory 的浪费,像前面举的例子,只需要 2KB 的内存,却分配了 4KB 的空间。如何正确的取舍,去做 tradeoff,这也是设计者需要考虑的。

再往本质里看,这其实是硬件设计上的一个“规整”问题。就像CPU指令集的设计,因为不同指令对 bit 利用的规整,简化了CPU的设计。规整即简单。

关于页表分级 - 时间换空间

页表是用来将虚拟地址映射为物理地址的数据结构。对于 4KB 的页单元,需要 12-bit 来寻址。如果地址线的总位宽是 32-bit,那么我们需要 2^20 (32-12=20) 个页表,假如每个表项用 4 byte,那么页表总共要用到 4MB 的内存。这还只是一个进程用到的空间。

页表分级减少了页表对内存的使用量。用过两级分页(第一级页目录+第二级页表),即先通过第一级页目录查找到页表,再通过第二级页表去查找页,只有当第一级的页目录项用到时才去分配第二级的页表。举个例子,假如页目录和页表分别占用10-bit。页目录有2^10个项 (一共占用 4KB 内存),假如页目录只有第一项被用到,那么我们只需要分配其对应的页表,这个页表也是有2^10个项 (一共占用 4KB 内存),那么此时只用到了 4KB+4KB = 8KB 内存,相比于 4MB 节省了很大部分。

我们总结一下页表分级的场景:

多个 Users 共用一份地址线访问 memory

每个 Users 都需要自己的 memory 空间

实际有效的 Users 的数目是动态变化的

Users 对 memory 空间的使用也是动态变化的

遇到类似的场景我们便可以考虑将地址分级,对 Users 动态分配 memory 空间,几个 Users 甚至可以复用一份 memory,达到节省 memory 使用的目的。这样做当然增加了 memory 控制和管理的复杂度,也是设计上的 tradeoff。

再往本质里看,这个场景其实利用了事件发生的时间上的差异。是时间“换”空间的概念,地址分级只是实现这个概念的一个手段。

总结

本文思考了内存寻址的两个设计点对 FPGA 设计的借鉴意义。很多时候,设计的思想是相通的,尤其是像 CPU 或者 Linux内核 这样的经典的,经久不衰的设计。

来源:   本文转载自FPGA开发之路 公众号

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分