首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memtest.c linux

memtest.c linux
EN

Stack Overflow用户
提问于 2015-12-09 09:01:16
回答 2查看 1K关注 0票数 1

我对C有基本的知识,在学习memtest.c时,我无法理解以下内容--源代码是从以下几个方面开始的:

代码语言:javascript
复制
 static u64 patterns[] __initdata = {
       /* The first entry has to be 0 to leave memtest with zeroed memory */
      0,
      0xffffffffffffffffULL,
      0x5555555555555555ULL,
      0xaaaaaaaaaaaaaaaaULL,
      0x1111111111111111ULL,
      0x2222222222222222ULL,
      0x4444444444444444ULL,
      0x8888888888888888ULL,
      0x3333333333333333ULL,
      0x6666666666666666ULL,
      0x9999999999999999ULL,
      0xccccccccccccccccULL,
      0x7777777777777777ULL,
      0xbbbbbbbbbbbbbbbbULL,
      0xddddddddddddddddULL,
      0xeeeeeeeeeeeeeeeeULL,
      0x7a6c7258554e494cULL, /* yeah ;-) */
 };

那么yeah ;-)的评论呢?:-)

我从未在C中见过这种情况--如何解释它,以及它是如何使用的?

编辑:现在更清楚的是,当u64显然是一个,而ULL是一个后缀,表示无符号的Long。但是这个数组中RAM的(表示)内存地址似乎是任意选择的?

EN

回答 2

Stack Overflow用户

发布于 2015-12-09 11:24:07

它们不是内存中的地址,而是测试模式。memtest将它们写入物理内存寄存器,读取写入的数据,并对其进行错误比较。

如果您按照它们出现在c代码段中的顺序将它们转换为二进制文件,则如下所示:

代码语言:javascript
复制
0000000000000000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111
0101010101010101010101010101010101010101010101010101010101010101
1010101010101010101010101010101010101010101010101010101010101010
0001000100010001000100010001000100010001000100010001000100010001
0010001000100010001000100010001000100010001000100010001000100010
0100010001000100010001000100010001000100010001000100010001000100
1000100010001000100010001000100010001000100010001000100010001000
0011001100110011001100110011001100110011001100110011001100110011
0110011001100110011001100110011001100110011001100110011001100110
1001100110011001100110011001100110011001100110011001100110011001
1100110011001100110011001100110011001100110011001100110011001100
0111011101110111011101110111011101110111011101110111011101110111
1011101110111011101110111011101110111011101110111011101110111011
1101110111011101110111011101110111011101110111011101110111011101
1110111011101110111011101110111011101110111011101110111011101110
0111101001101100011100100101100001010101010011100100100101001100

我用空格替换了0,然后,您可能会看到更好的模式:

代码语言:javascript
复制
1111111111111111111111111111111111111111111111111111111111111111
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1  
1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   
  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11
 11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11 
1  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  1
11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  11  
 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111
1 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11
11 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 1
111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 
 1111 1  11 11   111  1  1 11    1 1 1 1 1  111  1  1  1 1  11  

它改变了记忆中的1和0。这是一种比较常见的测试物理记忆的方法。每个位必须翻转多次。

最后一种模式不适合其他的模式。参见@purplepsycho answer,这意味着什么。这是最后一个模式,然后保存在测试的内存中。

您可以将第一部分复制到file中并在其上运行此awk,简短地演示内存中发生了什么(0已删除):

代码语言:javascript
复制
awk '{ORS="\r"; system("sleep 0.5"); gsub("0", " ", $0);}1' file
票数 4
EN

Stack Overflow用户

发布于 2015-12-09 09:54:26

/* yeah ;-) */的评论呢?

0x7a6c7258554e494c整数可以在( zlrXINUL )中解码(反向为“LINUX规则”)。

此语句声明一个由17 64位无符号整数组成的数组。我认为所有这些整数都将在每个内存空间中写入和读取,以检查操作中没有丢失任何位。

该数组的地址由程序内存中的编译器选择,程序将显式地选择RAM中要测试的每个地址。

下一个问题:如何测试存储程序的内存?内核会通过分页或分段来移动程序吗?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34179078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档