I have created a simple memtest program.
However, when I try to run it (with sudo, of course) it crashes at the following line:
main -> test_all -> test_running -> for (j=0; j<=memsize; j++) p[j]=1-value; // (first assignment operation)
And it does not specify the error. I am thinking about two possibilities:
1) Wrong memory range, should choose another one (which?)
2) Something wrong with my code (where?)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MEM_start 0xFD002000
#define MEM_end 0xFDFFFFFF
#define MEM_size 16769023
int test_running(int value) {
int i, j;
int flag=0;
int *p = (int *)MEM_start;
int memsize = (int)MEM_size;
for (i=0; i<=memsize; i++) {
for (j=0; j<=memsize; j++) p[j]=1-value;
p[i]=value;
if (p[i]!=value) { printf("Error at address: %p\n", &p[i]); flag++; }
for (j=0; j<=memsize; j++) {
if ((j!=i)&&(p[j]==value)) {
printf("Error at address: %p\n", &p[j]);
flag++;
}
}
}
return flag;
}
int test_chess() {
int i;
int flag=0;
int *p = (int *)MEM_start;
int memsize = (int)MEM_size;
for (i=0; i<=memsize; i++) p[i]=i%2;
for (i=0; i<=memsize; i++) if (p[i]!=i%2) { printf("Error at address: %p\n", &p[i]); flag++; }
for (i=0; i<=memsize; i++) p[i]=(i+1)%2;
for (i=0; i<=memsize; i++) if (p[i]!=(i+1)%2) { printf("Error at address: %p\n", &p[i]); flag++; }
return flag;
}
int test_random() {
int i, j;
int flag=0;
int *p = (int *)MEM_start;
int memsize = (int)MEM_size;
int buffer[32];
int buffer_size=32;
for (i=0; i<=memsize; i=i+buffer_size) {
for (j=0; j<=buffer_size; j++) buffer[j]=(0==(rand()%2));
for (j=0; j<=buffer_size; j++) p[i+j]=buffer[j];
for (j=0; j<=buffer_size; j++) if (p[i+j]!=buffer[i]) { printf("Error at address: %p\n", &p[i+j]); flag++; }
}
return flag;
}
int test_all() {
int test=0;
int flag;
flag=test_running(1);
if (flag) { test++; printf("Running 1 - FAIL\n"); }
else printf("Running 1 - SUCCESS\n");
flag=test_running(0);
if (flag) { test++; printf("Running 0 - FAIL"); }
else printf("Running 0 - SUCCESS\n");
flag=test_chess();
if (flag) { test++; printf("Chess - FAIL\n"); }
else printf("Chess - SUCCESS\n");
flag=test_chess();
if (flag) { test++; printf("Random - FAIL\n"); }
else printf("Random - SUCCESS\n");
if (test!=0) { printf("SOME TESTS FAILED: %i", test); return 1; }
else { printf("ALL TESTS PASSED!!!"); return 0; }
}
int main() {
srand(time(NULL));
test_all();
return 0;
}
UPDATE: the following links are quite helpful:
1) FixUnix: writing to device at a known physical address
2) DesignSomething: a simple code to read/write a physical address from userspace
The address
0xFD002000that you are trying to read/write to is not mapped in your process. Its not valid for your process to access it. That is why you are getting segmentation fault on first access to it.Also, note that (in mainstream desktop OSes like Windows, linux, Mac) the addresses in your processes are virtual addresses and not actual physical addresses. More at Virtual address space