本文链接:https://blog.csdn.net/zjomin/article/details/8954014
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.
————————————————
版权声明:本文为CSDN博主「i0dooo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iodoo/article/details/8954014