kmalloc的内存区域是否可能比模块范围的普通内存更快?

问题描述

内核是一个较旧的3.1.x版本,主板是带有外部NAND闪存的S3C2416。

我为一个错误而苦恼,该错误导致NAND闪存的ECC在3x8字节的ECC或多或少固定位置产生一位翻转的可能性非常大,而ECC是根据单个NAND页的256x8字节计算得出的。我已经确保这不是NAND介质问题,因为在将ECC发送到NAND控制器之前就已观察到位翻转。 ECC可以是从NAND控制器生成的HWECC,也可以是从内核代码生成的软件ECC,无论哪种情况,它总是有机会通过一次翻转产生错误的ECC。因此,这也不是NAND控制器的故障。

计算得出的ECC被保存在内核的缓冲区中:chip-> ecc-> calc_buf,该缓冲区是从kmalloc(mtd-> oobsize,GFP_KERNEL)分配的,其中oobsize =64。我的最终发现是:如果我不这样做,转到kmalloc(),但仅将预分配的缓冲区(作为nand_base.c模块中的静态变量)分配给chip-> ecc_buf,同一测试永远无法产生错误代码的更改如下:

static unsigned char my_buff[oobsize];
...
chip->ecc->calc_buf = my_buff;

在此之前的另一个发现是:仍然使用kmalloc,但是在NAND读/写操作之后插入了一些延迟,同一测试也无法产生错误

基于这些事实,对我来说,唯一合理的解释是:kmalloc缓存比模块内静态缓存要快。因此,访问模块内缓冲区实际上等于隐式插入一些延迟。您认为我的猜测可能是正确的吗?我认为kmalloc-ed缓冲区至少是字对齐的,但是我也认为my_buff通常也应该对齐。

BTW:ECC位翻转的模式非常有趣,几乎90%的情况下,当错误发生在同一页的可读写页面上时,它们都是相同的错误

correct ECC:
  5a a9 a6 a5 69 a6 00 **30** 33 69 59 56 3f c3 cf 56 99 66 ff 03 33 6a a9 66  
incorrect ECC:
  5a a9 a6 a5 69 a6 00 **10** 33 69 59 56 3f c3 cf 56 99 66 ff 03 33 6a a9 66

对于重置的10%,它们仍然是“ 1”变为“ 0”,只是发生在不同的位置。 (我实际上很想想,这是一个'0'未能更新为'1')。

谢谢。 木本

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)