|
阅读:5763回复:4
[求助]32位cpu是否支持4G内存的问题
看了<全面解析4GB内存无法完全识别问题>,这里我说的内存仅仅是指普通的DDR RAM, 还是很迷糊.比如32位地址线,最大可以访问4G,但是这个4G是否包括I/O地址,BIOS地址,如果包括的话那么肯定是不支持4G的了,但是x86的地址架构又是独立编码,也就是访问I/O地址又与访问RAM的指令不一样,是否可以认为对同一个数值的地址,如果用I/O指令方式访问(IN/OUT)就是访问I/O,而用RAM指令方式(普通指针方式赋值)访问就是访问RAM,那么,这样的话,又好像可以单独支持4G内存了.
我上面的猜测有什么问题了? |
|
|
沙发#
发布于:2008-10-20 00:41
1.4G不包括io地址,包括bios地址,包括memory mapped io
2.cpu的地址线早就超过32位了. 3.4G内存问题在北桥上面.. 4.windows xp不支持4G内存不是因为作不到..而是微软人为限制了内存使用..微软想你花更多钱买2003而不是xp来使用4G内存.你要使用8G内存..那么再花钱买enterprise edition. 要在xp上面使用4G以上内存..只是需要patch ntoskrnl的2个地方一共8个字节的数据... VOID MiCheckPaeLicense(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
ULONG MaxPages;
ULONG HighestPhysicalAddress;
if(ExVerifySuite(Blade) == TRUE)
{
//
// blade server?
// 2GB physical memory
// highest physical address is 128GB
//
MaxPages = 0x80000;
HighestPhysicalAddress = 0x2000000;
}
else if(ExVerifySuite(DataCenter) == TRUE)
{
if(LoaderBlock->u.I386.VirtualBias == 0)
{
//
// data center without /3GB
// 128GB physical memory
// highest physical address is 128GB
//
MaxPages = 0x2000000;
HighestPhysicalAddress = 0x2000000;
}
else
{
//
// The system is booting /3gb, so don't use more than 16gb of
// physical memory. This ensures enough virtual space to map
// the PFN database.
// 16GB physical memory
// highest physical address is 16GB
//
MaxPages = 0x400000;
HighestPhysicalAddress = 0x400000;
}
}
else if(MmProductType != 0x00690057 && ExVerifySuite(Enterprise) == TRUE)
{
//
// 0x00690057 means 'W' 'i',the first two charaters of 'WinNT' in unicode encoding
// this value will be 'S' 'e'(ServerNT) for the Server family,the other type such as windows xp it will be 'WinNT'
//
if(LoaderBlock->u.I386.VirtualBias == 0)
{
//
// Advanced Server is permitted a maximum of 64gb physical memory.
// The system continues to operate in 8-byte PTE mode.
// 64GB physical memory
// highest physical address is 128GB
//
MaxPages = 0x1000000;
HighestPhysicalAddress = 0x2000000;
}
else
{
//
// The system is booting /3gb, so don't use more than 16gb of
// physical memory. This ensures enough virtual space to map
// the PFN database.
//
MaxPages = 0x400000;
HighestPhysicalAddress = 0x400000;
}
}
else if(ExVerifySuite(TerminalServer) == TRUE)
{
//
// terminal server,windows 2003 standard edition and windows 2000 pro will be here
//
if(LoaderBlock->u.I386.VirtualBias == 0)
{
//
// without /3GB
// 4GB physical memory
// highest physical address is 128GB
//
MaxPages = 0x100000;
HighestPhysicalAddress = 0x2000000;
}
else
{
//
// The system is booting /3gb,
// 4GB physical memory
// highest physical address is 16GB
//
MaxPages = 0x100000;
HighestPhysicalAddress = 0x400000;
}
}
else
{
//
// the other type,such as windows xp and vista will be here[patch the numbers(0x100000)]
// 4GB physical memory
// highest physical address is 4GB
//
MaxPages = 0x100000;
HighestPhysicalAddress = 0x100000;
}
//
// for each memory descriptor,check its bounds
//
ULONG TotalPages = 0;
ULONG TotalUsablePages = 0;
for(PLIST_ENTRY NextMd = LoaderBlock->MemoryDescriptorListHead.Flink; NextMd != &LoaderBlock->MemoryDescriptorListHead; NextMd = MemoryDescriptor->ListEntry.Flink)
{
PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor = CONTAINING_RECORD(NextMd,MEMORY_ALLOCATION_DESCRIPTOR,ListEntry);
TYPE_OF_MEMORY Type = MemoryDescriptor->MemoryType;
//
// skip those special memory type
//
if(Type != LoaderFirmwarePermanent && Type != LoaderBad && Type != LoaderSpecialMemory && Type != LoaderBBTMemory)
{
//
// check highest physical address
//
if(HighestPhysicalAddress)
{
//
// the whole range is beyond the highest physcial address,remove this descriptor
//
if(MemoryDescriptor->BasePage >= HighestPhysicalAddress)
{
RemoveEntryList(&MemoryDescriptor->ListEntry);
continue;
}
else if(MemoryDescriptor->BasePage + MemoryDescriptor->PageCount > HighestPhysicalAddress)
{
//
// truncate it
//
MemoryDescriptor->PageCount = HighestPhysicalAddress - MemoryDescriptor->BasePage;
}
}
//
// check total size
//
TotalPages += MemoryDescriptor->PageCount;
if(TotalPages > MaxPages)
{
if(TotalPages - MemoryDescriptor->PageCount < MaxPages)
{
MemoryDescriptor->PageCount = MemoryDescriptor->PageCount - (TotalPages - MaxPages);
}
else
{
RemoveEntryList(&MemoryDescriptor->ListEntry);
continue;
}
}
if(MemoryDescriptor->PageCount)
TotalUsablePages += MemoryDescriptor->PageCount;
}
}
//
// kernel support 64bits DMA
//
if(MmDynamicPfn || TotalUsablePages > 0x100000)
Mm64BitPhysicalAddress = TRUE;
}look一下.... http://thxlp.spaces.live.com/blog/cns!6317274E5BA1CBD7!490.entry |
|
|
板凳#
发布于:2009-02-20 23:00
不懂,mark
|
|
|
地板#
发布于:2009-03-31 13:33
现在cpu大多数支持emt64,可以切换到long mode做64位操作,北桥的4G限制早已经不是问题,remap以后,可以解决。
os可以用64 version的windows. |
|
|
地下室#
发布于:2017-10-31 16:22
用户被禁言,该主题自动屏蔽! |
|