理解memtest86 +内存映射

时间:2016-06-09 19:05:34

标签: c linux memory-management x86

我试图了解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;
}

如果页面小于0x80000,则将其乘以4k。但如果没有,那些操作如何执行映射?

感谢。

0 个答案:

没有答案