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"



Изменение настроек впрыска. Услуги: чип тюнинг двигателя тойота. ООО "ЧИП-Т".
Поиск по сайту в FreeFind!:
Поиск в Google!:

WWW cpqlinux.com

Текущее положение:
Вернуться на главную: www.cpqlinux.com

Автор:
Ричард "Черный" (Richard Black)
Контакты: contact.html


Сайт создан в: 9/20/1999