- 论坛徽章:
- 0
|
回复 37# arm-linux-gcc
Hi arm-linux-gcc
Appreciate your explanation,you are excellent.
看了看cpu_v7_set_pte_ext,真是感觉拔云见日了, 真是没想到set_pte_ext是去设置linux pte而不是h/w pte。
所以说,通过linux pte到h/w pte映射,我们得到了如下映射
如果是以uncached去设置页表,(TEX,C,B)=(0,0,0), 这对应的是strong order,所以说IO操作不需要barrier
如果是以bufferable去设置页表,(TXE, C,B)=(0,0,1), 这对应的是normal+noncache, 所以说IO操作必须有barrier
这也是前面askua说bufferable应该映射成normal的原因,以及为什么我把ARM_DMA_MEM_BUFFERABLE关掉后,性能变差的原因(访问strong order显然比normal要消耗多),同时也说明了我在ARM_DMA_MEM_BUFFERABLE打开的情况下,把barrier关掉是危险的,虽然性能得到提升,但其实只是问题没有发生罢了。
其实还不太想结贴,我还有两个疑问。
1. 如askua前面所说的,在DDI0406C文档中3.5.7节,
“A physical memory location is accessed with mismatched attributes if all accesses to the location do not use a
common definition of all of the following attributes of that location..., 后面是这样操作的危害”
如果我们使用strong order,那这里会不会有这个危险,因为最开始所有的内存在map_low的时候,都会被映射成normal,现在同样这段内存,我们又要映射成strong order,物理内存一样,不同的只是虚存而已,会不会存在这个问题呢?
2. 还是前面说的那个,在取消ARM_DMA_MEM_BUFFERABLE的情况下,IO操作将不带barrier, 在A3.8DDI0406C文档, Figure A3-5,明确说明对于normal, strong order的两个指令,不能保证其顺序性。
我们在driver中,如果有如下指令
int A=XX;
A=LOAD(addr1). //从normal内存中读出index, A=YY
//rmb();
write32(addr2, A). //把这个index写入外设中,strong order类型memory。
我们知道现在write32已经不带有barrier了,那这里的rmb是不是也应该必须呢?不然会不会出现把XX而不是YY写入到外设中的情况呢?
Thanks
|
|