Linux kernel 是否可能是kmalloc';ed内存比模块作用域普通内存快?

Linux kernel 是否可能是kmalloc';ed内存比模块作用域普通内存快?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,内核是一个旧的3.1.x版本,主板是一个带有外部NAND闪存的S3C2416 我正在与一个导致NAND闪存ECC的错误作斗争,该错误很可能在ECC的3x8字节(从单个NAND页的256x8字节计算)中或多或少的固定位置产生一个位翻转。我已经确保这不是NAND介质问题,因为在ECC发送到NAND控制器之前观察到位翻转。ECC可以是从NAND控制器生成的HWECC,也可以是从内核代码生成的软件ECC,在这两种情况下,它总是有机会通过一位翻转生成错误的ECC。因此,这也不是NAND控制器的故障 计算出

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

我正在与一个导致NAND闪存ECC的错误作斗争,该错误很可能在ECC的3x8字节(从单个NAND页的256x8字节计算)中或多或少的固定位置产生一个位翻转。我已经确保这不是NAND介质问题,因为在ECC发送到NAND控制器之前观察到位翻转。ECC可以是从NAND控制器生成的HWECC,也可以是从内核代码生成的软件ECC,在这两种情况下,它总是有机会通过一位翻转生成错误的ECC。因此,这也不是NAND控制器的故障

计算出的ECC保存在内核的一个缓冲区中:chip->ECC->calc_buf,该缓冲区是从kmalloc(mtd->oobsize,GFP_内核)分配的,其中oobsize=64。我的最终发现是:如果我不使用kmalloc(),而只是将预先分配的缓冲区(作为nand_base.c模块中的静态变量)分配给芯片->ecc_buf,那么同样的测试永远不会产生错误。此代码的更改如下所示:

static unsigned char my_buff[oobsize];
...
chip->ecc->calc_buf = my_buff;
在此之前的另一个发现是:仍然使用kmalloc,但只是在NAND读/写操作之后插入了一些延迟,同样的测试也不能产生错误

有了这些事实,对我来说唯一合理的解释是:kmalloc ed缓冲区比模块内静态缓冲区快。因此,访问模块内缓冲区实际上相当于隐式插入一些延迟。你认为我的猜测可能是真的吗?我认为kmalloc ed缓冲区至少是单词对齐的,但我也认为my_buff通常也应该对齐

顺便说一句: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”)

谢谢。 伍迪