Linux и память
Определение был ли распознан объём всей Вашей памяти:
Используйте одну из следующих команд:
- Использование команды "free"
free
free -m
Проверьте в /proc/meminfo
cat /proc/meminfo
Использование команды "dmesg"
dmesg | less
Проверьте, что отображает при загрузке ядро системы на экране
После загрузки ядра, нажмите Shift PgUp и/или Shift PgDn для просмотра предыдущих экранных сообщений. Сообщения памяти располагаются в самом начале процедуры загрузки ядра.
Примечание: Как только Вы переключитесь из окна консоли, Вы больше не сможете использовать Shift PgUp для просмотра предыдущих экранных сообщений. Поэтому, после загрузки ядра, возможно, понадобится предупредить запуск GUI-интерфейса. Это можно выполнить несколькими путями:
- Войдите в "Однопользовательский сервисный режим" (уровень запуска 1):
linux S
Войдите в текстовый режим при инсталляции Linux:
linux text
Также, если Вы уже ввели команду памяти, но ничего не происходит, проверьте командную строку ядра, что она отображает:
dmesg | less (ближе к верху будет командная строка ядра)
- или -
cat /proc/cmdline
Примечания к указанию объёма памяти:
- Вы можете задать память при загрузке (BOOT): введите запрос (для LILO и SYSLINUX - т.e. командная строка загрузки при инсталляции Red Hat) в таком виде:
linux mem=...
- Вы можете задать в загрузочном меню GRUB путём редактирования входа ("e"), затем отредактировав строку ядра ("e"), и затем, добавив в конец строки ядра оператор памяти, в таком виде:
Из этого:
kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
В это:
kernel /vmlinuz-2.4.18-14 ro root=LABEL=/ mem=...
- Вы можете задать в /etc/lilo.conf путём добавления строки append таким образом (или путём добавления к существующей append= строке, как показано в примере):
Из этого:
image=/boot/vmlinuz-2.4.18-14
label=linux-up
initrd=/boot/initrd-2.4.18-14.img
read-only
append="root=LABEL=/"
В это:
image=/boot/vmlinuz-2.4.18-14
label=linux-up
initrd=/boot/initrd-2.4.18-14.img
read-only
append="root=LABEL=/ mem=..."
Не забудьте перезапустить /sbin/lilo после изменения /etc/lilo.conf, чтобы изменения вступили в силу.
- Вы можете задать в /boot/grub/grub.conf путём добавления к строке ядра таким образом:
Из этого:
title Red Hat Linux (2.4.18-14smp)
root (hd0,0)
kernel /vmlinuz-2.4.18-14smp ro root=LABEL=/
initrd /initrd-2.4.18-14smp.img
В это:
title Red Hat Linux (2.4.18-14smp)
root (hd0,0)
kernel /vmlinuz-2.4.18-14smp ro root=LABEL=/ mem=...
initrd /initrd-2.4.18-14smp.img
Замените любую из упомянутых выше mem=... любым из подходящих методов упомянутых ниже
МЕТОД1
МЕТОД2
МЕТОД3
МЕТОД4
Указание нераспознанной памяти - МЕТОД #1
Примечание: Для Red Hat 7.1 и выше (kernel 2.4.x и выше) попробуйте сначала МЕТОД #3 или МЕТОД #4.
Если весь объём памяти не был распознан автоматически, тогда Вы можете задать память при загрузке : в командной строке или в качестве append строки в /etc/lilo.conf.
Примечание: Это обычно происходит на компьютерах с использованием шины EISA. Компьютеры без разъёмов EISA обычно распознают всю установленную память.
Примечание: Данный метод #1 используется, если не распознается память свыше 16MБ. Если присутствуют проблемы с распознаванием памяти свыше 1ГБ, тогда прочтите, пожалуйста, другой раздел на данной странице.
Следующий формат записи используется при загрузке: в командной строке:
Red Hat 7.0 и предыдущие версии
mem=128M
Следующий формат записи используется, как часть append оператора в /etc/lilo.conf:
Red Hat 7.0 и предыдущие версии
append="mem=128M"
МЕТОД1
МЕТОД2
МЕТОД3
МЕТОД4
Указание нераспознанной памяти - МЕТОД #2
Примечание: Для Red Hat 7.1 и выше (kernel 2.4.x и выше) попробуйте сначала Метод #3 или Метод #4.
На серверах, где не определяется свыше 16МБ, присутствует альтернативный метод, который так же хорош, как и Метод #1:
mem=exactmap mem=0x9f000@0 mem=0x13f00000@0x100000
Я расшифровал предыдущие значения для более лёгкого прочтения:
0x9f000 = 651264 bytes = 636k
0xA0000 = 655360 bytes = 640k
0x13f00000 = 334495744 bytes = 326656k = 319M
0x14000000 = 335544320 bytes = 327680k = 320M
0x100000 = 1048576 bytes = 1024k = 1M
"mem=0x9f000@0" установит нижние 640k.
"mem=0x13f00000@0x100000" установит от 1M до 320M
Насколько я могу судить, указанные выше условия начинаются с 1M и заканчиваются 319M. Это даст Вам итоговых 319M с нижними 640k
Вышеупомянутые значения будут работать (как показано, если у Вас 320M), но я должен буду проверить дважды, сколько точно памяти распознано с использованием данного метода.
Получается, чтобы вычислить значение, нужно взять Вашу память в МБ, умножить на 1024, умножить на 1024, затем преобразовать в hex, затем отнять 0x100000.
Вот пример:
Для 128M:
128 * 1024 = 131072
131072 * 1024 = 134217728
134217728 -> Hex = 0x8000000
0x8000000 - 0x100000 = 0x7F00000
Затем Вы используете:
mem=exactmap mem=0x9f000@0 mem=0x7f00000@0x100000
Для 256M:
256M * 1024 = 262144
262144 * 1024 = 268435456
268435456 -> Hex = 0x10000000
0x10000000 - 0x100000 = 0xFF00000
Затем Вы используете:
mem=exactmap mem=0x9f000@0 mem=0xff00000@0x100000
Другой метод, который приведёт Вас к тому же числу: взять Вашу память в MB, вычесть 1MB, умножить на 1024, умножить на 1024, затем преобразовать в hex.
256M - 1 = 255
255 * 1024 = 261120
261120 * 1024 = 267386880
267386880 -> Hex = 0xFF00000
Вот несколько примеров использования Метода #2:
16M: linux mem=exactmap mem=0x9f000@0 mem=0x0f00000@0x100000
32M: linux mem=exactmap mem=0x9f000@0 mem=0x1f00000@0x100000
48M: linux mem=exactmap mem=0x9f000@0 mem=0x2f00000@0x100000
64M: linux mem=exactmap mem=0x9f000@0 mem=0x3f00000@0x100000
80M: linux mem=exactmap mem=0x9f000@0 mem=0x4f00000@0x100000
96M: linux mem=exactmap mem=0x9f000@0 mem=0x5f00000@0x100000
112M: linux mem=exactmap mem=0x9f000@0 mem=0x6f00000@0x100000
128M: linux mem=exactmap mem=0x9f000@0 mem=0x7f00000@0x100000
144M: linux mem=exactmap mem=0x9f000@0 mem=0x8f00000@0x100000
160M: linux mem=exactmap mem=0x9f000@0 mem=0x9f00000@0x100000
176M: linux mem=exactmap mem=0x9f000@0 mem=0xaf00000@0x100000
192M: linux mem=exactmap mem=0x9f000@0 mem=0xbf00000@0x100000
208M: linux mem=exactmap mem=0x9f000@0 mem=0xcf00000@0x100000
224M: linux mem=exactmap mem=0x9f000@0 mem=0xdf00000@0x100000
240M: linux mem=exactmap mem=0x9f000@0 mem=0xef00000@0x100000
256M: linux mem=exactmap mem=0x9f000@0 mem=0xff00000@0x100000
512M: linux mem=exactmap mem=0x9f000@0 mem=0x1ff00000@0x100000
МЕТОД1
МЕТОД2
МЕТОД3
МЕТОД4
Указание нераспознанной памяти - МЕТОД #3
По существу это метод #2, но в более читабельном формате.
Для компьютера с 48M памяти Вам следует использовать следующее:
linux mem=exactmap mem=640K@0 mem=47M@1M
96M
linux mem=exactmap mem=640K@0 mem=95M@1M
128M
linux mem=exactmap mem=640K@0 mem=127M@1M
256M
linux mem=exactmap mem=640K@0 mem=255M@1M
Прочтите Метод #2, если Вам требуется лучшее понимание того, как работают эти команды памяти.
Спасибо NKJensen из Дании за оказание нам помощи!
NKJensen также обнаружил следующие свойства относительно применения данного метода в /etc/lilo.conf:
- Если Вы поместите "append=" строку в общий раздел /etc/lilo.conf (раздел в самом начале /etc/lilo.conf перед отдельными загрузочными областями), это будет применено ко всем областям загрузки в /etc/lilo.conf.
- В начале кавычек append строки, требуется пробел:
append=" mem=exactmap mem=640K@0 mem=95M@1M"
Как всегда, не забудьте запустить /sbin/lilo после того, как закончите вносить изменения в /etc/lilo.conf.
Вот несколько примеров использования Метода #3:
32M: linux mem=exactmap mem=640K@0 mem=31M@1M
48M: linux mem=exactmap mem=640K@0 mem=47M@1M
64M: linux mem=exactmap mem=640K@0 mem=63M@1M
96M: linux mem=exactmap mem=640K@0 mem=95M@1M
128M: linux mem=exactmap mem=640K@0 mem=127M@1M
256M: linux mem=exactmap mem=640K@0 mem=255M@1M
512M: linux mem=exactmap mem=640K@0 mem=511M@1M
Как нововведение для 2.6.x и возможно 2.4.x, попробуйте параметр memmap следующим образом:
memmap=496M@16M
МЕТОД1
МЕТОД2
МЕТОД3
МЕТОД4
Указание нераспознанной памяти - МЕТОД #4
Другой метод состоит в следующем:
Если Ваша система распознает 16MB памяти, а у Вас 256MB, Вы должны задать оставшиеся 240 MB (256 - 16 = 240 MB) следующим образом:
mem=240M@16M
- или -
append="mem=240M@16M"
Этот метод оказался требующим намного меньше ввода, чем метод #3. Спасибо Federico Allegretti за то, что обратил на это внимание.
Как нововведение для 2.6.x и возможно 2.4.x, попробуйте параметр memmap следующим образом:
memmap=496M@16M
Инсталляция при объёме памяти более 1ГБ:
Не разумно давать инсталлятору использовать более 1ГБ памяти. Инсталлятор может и не быть настроен оперировать таким объёмом, и может сбиться и аварийно завершить работу. Ограничьте количество памяти, видимой инсталлятором до 960M. Следующее можно ввести в командной строке загрузки:
mem=960M
Получение доступа к памяти свыше 1ГБ:
Если Ваша система не распознаёт свыше 1ГБ памяти, тогда есть несколько путей, чтобы это обойти:
- Установите Enterprise-kernel - здесь уже присутствует встроенная поддержка большего объёма памяти
- Перекомпилируйте ядро с использованием 1ГБ, 2ГБ или 4ГБ во время настройки конфигурации
- Перекомпилируйте ядро, разрешающее bigmem
Примечания к Linux Kernel 2.4
Вот некоторые отрывки из файла: arch/i386/kernel/setup.c
459-474:
/*
* Скопируйте таблицу распределения адресов BIOS e820 в безопасное место.
*
* Проверьте работоспособность, раз уж мы заговорили об этом..
*
* Если нам повезёт и у нас современная система, программа настройки
* выдаст нам таблицу адресного пространства, с помощью которой мы сможем корректно
* настроить память. Если нет - мы подделаем таблицу адресов.
*
* Мы проверим содержит ли адресное пространство, как минимум 2 элемента
* перед тем, как его использовать, так как код обнаружения в setup.S может
* не быть идеальным и почти у каждого ПК, известного нам, имеет две области
* памяти: одна от 0 до 640k, и другая от 1МБ и выше. (IBM
* thinkpad 560x, например, не взаимодействует с кодом обнаружения
* памяти.)
*/
520-525:
/*
* Попытайтесь скопировать таблицу распределения адресов BIOS e820.
*
* В противном случае - подделайте таблицу распределения адресов; одну секцию от 0k->640k,
* следующую от 1mb->appropriate_mem_k
*/
558-564:
/*
* "mem=nopentium" отключает поддержку 4МБ страниц памяти.
* "mem=XXX[kKmM]" определяет область памяти от HIGH_MEM
* to <mem>, переопределение размеров bios.
* "mem=XXX[KkmM]@XXX[KkmM]" определяет область памяти от
* <start> до <start> <mem>, переопределяет размер bios.
*/
577-582:
/* Если пользователь задаёт размер памяти, мы
* ограничиваем таблицу адресов BIOS до
* этого размера. Можно использовать exactmap для задания
* точной таблицы. mem=число можно использовать для
* урезания существующей таблицы адресов.
*/
Примечания к Linux Kernel 2.6
Debian 3.0 'Sarge' (тестирование) / 2.6.x kernel
/*
* "mem=nopentium" отключает поддержку 4МБ страниц памяти.
* "mem=XXX[kKmM]" определяет область памяти от HIGH_MEM
* to , переопределение размеров bios.
* "memmap=XXX[KkmM]@XXX[KkmM]" определяет область памяти от
* до , переопределяет размер bios.
Нужно использовать (после инсталляции) memmap=496M@16M (для назначения 512МБ памяти)
Другие примечания по памяти:
Если Вы закроете несоответствие памяти в настройках EISA (SCU), тогда mem=xyzM должно работать, не попадая в 16МБ дыру.
Если у Вас уже есть append строка, тогда просто добавьте команду памяти к существующей append строке, другими словами, это:
append="devfs=mount"
переделать в это:
append="devfs=mount mem=63M@16M"
|