Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 读取/写入特定内存地址(非常简单的memtest)——>;分段故障_Linux_Testing_Memory_Pointers_Segmentation Fault - Fatal编程技术网

Linux 读取/写入特定内存地址(非常简单的memtest)——>;分段故障

Linux 读取/写入特定内存地址(非常简单的memtest)——>;分段故障,linux,testing,memory,pointers,segmentation-fault,Linux,Testing,Memory,Pointers,Segmentation Fault,我创建了一个简单的memtest程序 但是,当我尝试运行它(当然是sudo)时,它会在以下行崩溃: main->test_all->test_running->for(j=0;j您尝试读取/写入的地址0xFD002000未映射到您的进程中。您的进程访问它是无效的。这就是为什么您第一次访问它时出现分段错误的原因 另外,请注意(在Windows、linux、Mac等主流桌面操作系统中)进程中的地址是虚拟地址,而不是实际的物理地址。更多信息,请参阅进程中未映射您尝试读取/写入的地址0xFD002000

我创建了一个简单的memtest程序

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


main->test_all->test_running->for(j=0;j您尝试读取/写入的地址
0xFD002000
未映射到您的进程中。您的进程访问它是无效的。这就是为什么您第一次访问它时出现分段错误的原因


另外,请注意(在Windows、linux、Mac等主流桌面操作系统中)进程中的地址是虚拟地址,而不是实际的物理地址。更多信息,请参阅进程中未映射您尝试读取/写入的地址
0xFD002000
。进程访问该地址无效。这就是为什么首次访问时出现分段错误的原因


也注意到(在Windows、Linux、MAC等主流桌面系统中,地址是虚拟地址而不是实际物理地址。在

< P>使用更多的代码> Malc C < /C>或<代码>新< /Cord>——这取决于您使用C还是C++。


也避免强制转换-它们通常暗示你在做错事。

< P>使用<代码> Malc C < /C> >或<代码>新< /C> >这要看你是用C还是C++。


还要避免强制转换-它们通常意味着你做了错事。

@JakeBadlands:如果你想映射到一个特定的虚拟地址,请参阅mmap()。从用户空间映射一个特定的物理地址是不可能的,你需要修改内核。@JakeBadlands-你为什么要实现这个目标?让妻子(又名OS)来吧继续解决这些问题,@EdHeal我正在制作一个简单的memtest程序,因此,如果测试失败,它应该检测哪个物理地址失败。@JakeBadlands,获取物理地址并不是那么简单。@JakeBadlands:如果要映射到特定的虚拟地址,请参阅mmap()。从用户空间映射特定的物理地址是不可能的,您需要修改内核。@JakeBadlands-为什么要实现这一点?让妻子(又名OS)来吧继续解决这些问题,@EdHeal我正在制作一个简单的memtest程序,因此如果测试失败,它应该检测哪个物理地址失败。@JakeBadlands,获取物理地址并不是那么简单。
#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;
}