Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
C 了解memtest86+;内存映射_C_Linux_Memory Management_X86 - Fatal编程技术网

C 了解memtest86+;内存映射

C 了解memtest86+;内存映射,c,linux,memory-management,x86,C,Linux,Memory Management,X86,我试图理解memtest86+是如何工作的,但是我不理解映射操作。memtest86+以32位模式运行,并使用PAE处理超过4Gb的数据。我仍然不完全理解PAE是如何工作的。在初始化的某个时刻,它从BIOS获取e820内存映射,地址是64位整数(是否能够处理4Gb以上的数据?)。然后将其转换为页面,将这些地址除以4k,并将其存储在32位整数中。之后,我了解到它通过执行以下映射操作将其转换回“字节地址”: void *mapping(unsigned long page_addr) { v

我试图理解memtest86+是如何工作的,但是我不理解映射操作。memtest86+以32位模式运行,并使用PAE处理超过4Gb的数据。我仍然不完全理解PAE是如何工作的。在初始化的某个时刻,它从BIOS获取e820内存映射,地址是64位整数(是否能够处理4Gb以上的数据?)。然后将其转换为页面,将这些地址除以4k,并将其存储在32位整数中。之后,我了解到它通过执行以下映射操作将其转换回“字节地址”:

void *mapping(unsigned long page_addr)
{
    void *result;
    if (page_addr < 0x80000) {
        /* If the address is less than 1GB directly use the address */
        result = (void *)(page_addr << 12);
    }
    else {
        unsigned long alias;
        alias = page_addr & 0x7FFFF;
        alias += 0x80000;
        result = (void *)(alias << 12);
    }
    return result;
}

void *emapping(unsigned long page_addr)
{
    void *result;
    result = mapping(page_addr -1);
    /* Fill in the low address bits */
    result = ((unsigned char *)result) + 0xffc;
    return result;
}
void*映射(无符号长页地址)
{
无效*结果;
如果(页码地址<0x80000){
/*如果地址小于1GB,请直接使用该地址*/
结果=(无效*)(页码地址