gpt4 book ai didi

linux - 读取/写入特定内存地址(非常简单的内存测试)-> 段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:20 25 4
gpt4 key购买 nike

我创建了一个简单的内存测试程序。

但是,当我尝试运行它(当然是使用 sudo)时,它会在以下行崩溃:

main -> test_all -> test_running -> for (j=0; j<=memsize; j++) p[j]=1-value;//(第一次赋值操作)

而且它没有指定错误。我在考虑两种可能性:

1) 错误的内存范围,应该选择另一个(哪个?)

2) 我的代码有问题(哪里?)

#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;
}

更新:以下链接非常有用:1) FixUnix: writing to device at a known physical address

2) DesignSomething: a simple code to read/write a physical address from userspace

最佳答案

您尝试读取/写入的地址 0xFD002000 未映射到您的进程中。它对您访问它的进程无效。这就是为什么您在第一次访问它时遇到段错误的原因。

另外,请注意(在主流桌面操作系统,如 Windows、Linux、Mac 中)进程中的地址是虚拟地址,而不是实际的物理地址。更多信息 Virtual address space

关于linux - 读取/写入特定内存地址(非常简单的内存测试)-> 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com