|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本文的目的不是介绍内存寻址的具体设计,其实很多细节我也不了解,而是想通过内存寻址的设计思想看看对 FPGA 的设计有什么帮助和借鉴。8 a8 Z: b6 ?$ b, i! D
& J4 A: g g- U* \" e$ f& ~0 L
内存寻址有两个的重要的设计:8 a" H& d- r8 t; p2 p: e4 _4 T
$ r2 R" Q/ ^1 O& c" P关于内存分页 - 规整即简单
0 W" ?' e$ {; w2 l" k) V内存分页即将内存分割为以页(一般是4KB)为单元的块,然后内存的分配和使用都是以页为最小单元。假如一个进程只需要 2KB 的内存,仍然给其分配 4KB(一页)的空间。
! l. j. q% B- ]3 K3 ~0 g Q) s! k, {7 x
关于内存分页的好处,我觉得知乎上一位知友的描述非常生动和形象。他将内存分页比喻为停车场划分停车位。停车位的划分使得停车人寻找停车位时变得简单,停车人不再需要自己判断位置空间是否够大能停下车,只需要看有没有空位即可。同时也使停车位的使用管理变得高效,停车场管理人员可以很容易判断并发布停车位的空位信息。当然,这可能只是内存分页的好处中的其中一个。
5 G6 c0 G6 p5 t" j0 ]* d* p- q/ F: \( p2 v
我们可以总结一下内存分页的使用场景:
3 `+ K9 X# u8 @$ F9 |% ]. h0 {( E- x0 P5 S; g. A* \ b9 }
有一块大的 memory 空间+ l6 A+ [4 |+ {
4 [9 J/ w0 M' G0 {有很多 Users 要使用 memory
# A6 o% h4 y0 x) r& t* S
2 K# } J; \* _3 m& T+ GUsers 使用 memory 的时间和空间大小不确定
2 {+ X& r, w2 \ s) ?+ P" j$ d+ ^/ o1 ^: X7 t
那么当我们在 FPGA 设计中遇到这样类似的场景时,便可以借鉴内存分页的思想,将 memory 划分为不同的块,来提高 memory 的使用和管理效率。当然,对于 memory 块的划分可能导致 memory 的浪费,像前面举的例子,只需要 2KB 的内存,却分配了 4KB 的空间。如何正确的取舍,去做 tradeoff,这也是设计者需要考虑的。
. d7 k E, s3 _( ]
1 m; k, [; y* Z+ T再往本质里看,这其实是硬件设计上的一个“规整”问题。就像CPU指令集的设计,因为不同指令对 bit 利用的规整,简化了CPU的设计。规整即简单。. q- m3 z! V2 W) R6 h0 S2 U
) e; m5 y& ~+ w
关于页表分级 - 时间换空间
7 w" _% C4 ?1 ~5 V2 R页表是用来将虚拟地址映射为物理地址的数据结构。对于 4KB 的页单元,需要 12-bit 来寻址。如果地址线的总位宽是 32-bit,那么我们需要 2^20 (32-12=20) 个页表,假如每个表项用 4 byte,那么页表总共要用到 4MB 的内存。这还只是一个进程用到的空间。5 T u- w1 D6 Z3 n% L
4 o. P- q- z$ g- e1 T
页表分级减少了页表对内存的使用量。用过两级分页(第一级页目录+第二级页表),即先通过第一级页目录查找到页表,再通过第二级页表去查找页,只有当第一级的页目录项用到时才去分配第二级的页表。举个例子,假如页目录和页表分别占用10-bit。页目录有2^10个项 (一共占用 4KB 内存),假如页目录只有第一项被用到,那么我们只需要分配其对应的页表,这个页表也是有2^10个项 (一共占用 4KB 内存),那么此时只用到了 4KB+4KB = 8KB 内存,相比于 4MB 节省了很大部分。, m# r( h# S. n7 U
{! {8 l' R. t" C+ B1 N
我们总结一下页表分级的场景:/ S$ M5 D% u4 z# V* K& u" c
. l: f/ k% F. J! V) w; R- @
多个 Users 共用一份地址线访问 memory
; K4 W7 _* S3 {6 o7 w* p9 r4 N6 K
) g, u M. v+ h, m+ O% {* I, T }( Q每个 Users 都需要自己的 memory 空间/ b7 e. _" J( |, e4 `
+ E; Y: n" b, [1 p- c5 ~+ M: A |- C
实际有效的 Users 的数目是动态变化的! z6 x! {' @: O
1 Y- M# P+ f: D6 I( lUsers 对 memory 空间的使用也是动态变化的
! o+ s9 ]2 [2 P( P2 T, n, d2 {& _+ X" f# w4 _" p8 }
遇到类似的场景我们便可以考虑将地址分级,对 Users 动态分配 memory 空间,几个 Users 甚至可以复用一份 memory,达到节省 memory 使用的目的。这样做当然增加了 memory 控制和管理的复杂度,也是设计上的 tradeoff。
- T2 L7 D0 I3 I( ]( ^& Z1 f- p8 Y# B8 e' o
再往本质里看,这个场景其实利用了事件发生的时间上的差异。是时间“换”空间的概念,地址分级只是实现这个概念的一个手段。
! h; N- J) i+ V& l4 e1 f" }! ~; J9 H a1 y: J: F+ c
总结
" S: K& v1 F% v' p, W本文思考了内存寻址的两个设计点对 FPGA 设计的借鉴意义。很多时候,设计的思想是相通的,尤其是像 CPU 或者 Linux内核 这样的经典的,经久不衰的设计。& W( m, p/ [2 i& r
|
|