我试图了解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。但如果没有,那些操作如何执行映射?
感谢。