MMU 负责地址映射,将CPU中虚拟地址VA映射到物理地址PA,CPU 启动时,默认是不开启MMU的,因此,需要有一段代码来开启MMU。
这段代码有个条件是,所处的地址,虚拟地址必须等于物理地址。否则,映射之后,PC 中的地址会当做虚拟地址处理,寻址就会读取到其他不确定地方的数据。
与在汇编的层面来看,地址就是存储地址,不会当做数据;而C语言中的变量地址,则会当做数据;这一点编译器会自动处理而不用关心。
单核处理器,使用Dcache 只存在一个问题,即与 DMA 会数据不一致的问题。
CPU 读取 RAM 数据,如果 Dcache 命中,则读取 Dcache 中的值,未命中则读取 RAM 中的值。写数据时,有两种方式: write through 和 write back。
write through 方式:CPU 将数据同时写回到 Dcache 和 RAM 中,这个过程与不开 Dcache 消耗的时间一样。
write back 方式: CPU 将数据写到 Dcache 中,并将该数值标志为 dirty, 当 Dcache 释放该数据时,将值写回到 RAM 中。这个过程是比较快捷的。
DMA 通常负责外设与 RAM 的通信,是不经过 CPU 的。
当 DMA 修改 RAM 中的数据时,CPU 是不知道的。
关于 CP15 中 C7 的说明:
:
Invalidate cache | 使所有的cache 数据无效,包括dirty数据 |
Invalidate single entry using either index or modified virtual address | 使单个cache line 无效,丢弃所有的dirty 数据 |
Clean single data entry using either index or modified virtual address | 如果cache line 为有效且dirty,将它写回主存;line标志去掉dirty,有效位不变。 |
Clean and invalidate single data entry using either index or modified virtual address | 如果有效且dirty,将指定的cache line 写回到主存,并标为无效。 |
Test and clean DCache | 测试一系列的cache line,并把dirty 清除掉,并返回全部dirty 状态到bit 30 |
了解到一系列的注意事项,在ucos中打开Dcache,发现网速提高了3倍。
测试数据如下:
TCP server listening.
TCP connection established ...
Receiving from client, packet size 1k ... 868.28 KByte/s
Sending to client, packet size 1k ... 7306.33 KByte/s
Receiving from client, packet size 2k ... 1737.77 KByte/s
Sending to client, packet size 2k ... 7699.00 KByte/s
Receiving from client, packet size 4k ... 3476.21 KByte/s
Sending to client, packet size 4k ... 7318.00 KByte/s
Receiving from client, packet size 8k ... 6734.99 KByte/s
Sending to client, packet size 8k ... 7537.55 KByte/s
Receiving from client, packet size 16k ... 6406.88 KByte/s
Sending to client, packet size 16k ... 7057.89 KByte/s
Receiving from client, packet size 32k ... 6746.81 KByte/s
Sending to client, packet size 32k ... 6924.11 KByte/s
Done.