On Mon, Feb 18, 2008 at 03:10:46PM +0300, Maks Re wrote: > а вот и логи Доступные для ядра области памяти (по данным BIOS): BIOS-e820: 0000000000000000 - 000000000008f000 (usable) BIOS-e820: 0000000000100000 - 00000000cf584000 (usable) BIOS-e820: 00000000cf591000 - 00000000cf625000 (usable) BIOS-e820: 00000000cf6df000 - 00000000cf6f0000 (usable) BIOS-e820: 00000000cf6ff000 - 00000000cf700000 (usable) BIOS-e820: 0000000100000000 - 000000012c000000 (usable) Теперь разберём настройки MTRR: reg00: base=0x00000000 ( 0MB), size=2048MB: write-back, count=1 reg01: base=0x80000000 (2048MB), size=1024MB: write-back, count=1 reg02: base=0xc0000000 (3072MB), size= 256MB: write-back, count=1 Эти регистры покрывают область адресов от 0x00000000 до 0xd0000000; все обычные области памяти ниже 4G, заявленные в BIOS-e820, входят в этот диапазон, так что тут всё нормально. reg03: base=0xcf800000 (3320MB), size= 8MB: uncachable, count=1 reg04: base=0xcf700000 (3319MB), size= 1MB: uncachable, count=1 Этими регистрами помечается как некешируемая область адресов от 0xcf700000 до 0xd0000000 - эта область не перекрывается ни с одной из областей BIOS-e820, помеченных как usable, что тоже правильно. reg05: base=0x100000000 (4096MB), size= 512MB: write-back, count=1 reg06: base=0x120000000 (4608MB), size= 128MB: write-back, count=1 Эти регистры устанавливают тип write-back для области адресов от 0x100000000 до 0x128000000. Однако в BIOS-e820 сообщается, что доступная память находится по адресам от 0x100000000 до 0x12c000000, следовательно, имеется область памяти (0x128000000 - 0x12c000000, 64MB), которая не покрывается ни одним из регистров MTRR. В результате эта память не кешируется, что приводит к громадному замедлению работы при её использовании. Подобная ошибка в BIOS многих материнских плат от Intel давно известна; например, вот одно из обсуждений: http://www.fedoraforum.org/forum/showthread.php?t=157232&page=4 Ошибка проявляется при установке >= 4GB RAM, причём только при условии использования ядра, которое может адресовать память за пределами первых 4 GB адресного пространства (именно поэтому 32-разрядное std-smp работает с нормальной скоростью - это ядро просто не может использовать память за пределами первых 4 GB, поэтому не использует проблемную область; а вот на x86_64 эта проблема бы проявилась и в std-smp). Простейший способ обойти данную проблему - ограничить используемую ядром память, отключив проблемные 64 MB; для этого можно использовать параметр ядра mem=4736M (0x128000000/1024/1024, или 4608+128 по данным последнего используемого регистра MTRR). Возможен также вариант с добавлением настроек MTRR при загрузке, но это сложнее, и на первых стадиях загрузки всё равно будет наблюдаться замедление.