Показать полную графическую версию : Война за первые 640 kb памяти
Кто-нибудь боролся за первые 640 кило памяти? Подскажите, что можно сотворить такого. Испробовал уже много от сторонних производителей. QEMM стоит, но Vidram запускается далеко не на всех машинах, а без него памяти маловато будет. Единственное что остается, ИМХО, это править руками конфиги. Вот и вопрос - что там особенного можно сотворить? Или в QEMM есть какие-нибудь злые настройки?
mazepkstan
31-01-2003, 23:43
А сколько надо-то?
Обычно (под Win98) в config.sys:
dos=high,umb
device=c:\himem.sys
device=c:\windows\emm386.exe ram
Дальше всё что можно devicehigh
В autoexec.bat всё что можно loadhigh
mazepkstan
Для нормальной работы надо 610-620 кб _минимум_ :( Поэтому и спрашиваю. Едиственное, что можно, как мне кажется - это избавиться от всего лишнего в загрузке, и что лезет куда не надо. А вот что конкретнее - вопрос.
Исправлено: Cursed, 0:54 1-02-2003
А что у тебя там вообще есть-то сейчас?
Если хочешь побольше памяти, запускай emm386 с ключом scanhigh (без слэша), но не гарантирую, что после этого будет нормально грузиться винда. В BIOS'е убери все shadow.
Далее, в config.sys:
fileshigh=60
fcbshigh=1
buffershigh=12
немного памяти можешь ещё получить за счёт lastdrivehigh=K
Country=007,866,C:\WINDOWS\COMMAND\country.sys
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
installhigh=C:\WINDOWS\COMMAND\mode.com con cp prepare=((866) c:\windows\command\ega.cpi)
installhigh=C:\WINDOWS\COMMAND\mode.com con cp select=866
Можешь там тоже, в принципе, оставить. Из них разве что только display.sys остаётся в памяти (не уверен), остальные делают свои настройки и выгружаются. Это всё настройка кода страны и русификаторы. Если не нужны - выкинь. А вот русификатор клавиатуры
installhigh=C:\WINDOWS\COMMAND\keyb.com ru,866,c:\windows\command\keybrd3.sys
в памяти остаётся точно.
Если хочешь полный контроль, то пиши
dos=high,umb,noauto
но тогда в config.sys обязательно должна быть строка
device=c:\windows\ifshlp.sys
иначе не будет грузиться винда (это драйвер VFAT).
В autoexec.bat в этом случае можешь вообще ничего не оставлять, кроме
set TEMP=C:\TEMP
set TMP=C:\TEMP
SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\ARC;C:\UTL;C:\VC;C:\NC
Если при работе в DOS будет много обращений к винту, запусти также кэш:
lh c:\windows\smartdrv.exe a b- c+
Но он откусит много памяти.
Что ещё там у тебя есть?
Yozh
fcbshigh=1, buffershigh=12 - а это зачем? В моем случае их просто нет. И зачем с high? Разве хоть что-то изменится? Ведь это управляющие параметры.
Далее, если русификацию вообще выкинуть я имею в виду строки
Country=007,866,C:\WINDOWS\COMMAND\country.sys
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
installhigh=C:\WINDOWS\COMMAND\mode.com con cp prepare=((866) c:\windows\command\ega.cpi)
installhigh=C:\WINDOWS\COMMAND\mode.com con cp select=866
installhigh=C:\WINDOWS\COMMAND\keyb.com ru,866,c:\windows\command\keybrd3.sys
то что можно использовать заместо ее с минимальным размером занимаемой памяти? Русификаторов много, какой лучше?
На данный момент у меня все то, что понаписала винда при установке, плюс параметры:
В autoexec.bat: files=250
В config.sys: SET CLIPPER=F250
Плюс ко всему, установлен QEMM версии 8.0, в результате свободно всего-лишь 605 кб. Хотя, судя по всему, он в верхнюю память затолкал все, что мог. Возможно, что в винде грузится что-то еще при запуске досовой проги. Забыл посмотреть dosstart.bat - теперь до понедельника :(
Во-первых. Вместо того чтобы гадать на кофейной гуще, выполни команду
mem /d >mem.txt
и внимательно изучи содержимое файла mem.txt. Либо выполни
mem /d|more и изучай то же самое прямо в окне MSDOS.
Во-вторых, fsbshigh.
Немного истории. MSDOS 1.0 не знала, что такое каталоги. Базовая конигурация первых IBM PC не включала жёсткий диск, потому всё пока создавалось в одном - корневом - каталоге. Для манипуляции с открываемыми файлами служили т.н. File Contol Blocks. В MSDOS 2.0 появились каталоги, а FCB сменились более гибкими структурами - File Handlers.
Максимальное количество одновременно обрабатываемых FCB задаётся при помощи FCBS=x, для File Handlers - FILES=x (ну, или xxxHIGH=x, начиная с Win95 тоже возможно).
Если ты не указываешь в config.sys эти параметры, система берёт по умолчанию: FILES=8, FCBS=4 (в целях совместимости неизвестно с кем).
Чем это грозит? Под каждый FCB выделяется 64 байта памяти или что-то в этом роде. Т.о., при FCBS=4 ты теряешь 256 байт. Мелочь, а неприятно, правда?
Ты запускаешь программы, которые открывают файлы через FCBs? Если нет, то, может, не будем тратить байты попусту?
Посмотри в дампе, сколько памяти ты теряешь на FILES=250? Оно тебе столько надо? Может, ограничимся чем-нибудь вроде 100? Неужто у тебя CLIPPER будет держать открытыми сразу 250 файлов?
Вот для примера дамп by default:
192 (0K) FILES=8
256 (0K) FCBS=4
10 720 (10K) BUFFERS=20
А как у тебя дело обстоит?
Если запускаешь DOS-программу из винды, то зачем тебе, кстати, BUFFERS=20? У меня есть подозрение, что виндовский дисковый кэш с этими задачами справися лучше.
Что касается FCBS и FCBSHIGH, то я пока тоже ничего ответить не могу. У меня винда по FCBSHIGH упорно не хочет помещать это в UMB. Будем разбираться.
Из русификаторов: попробуй keyrus
Добавлено:
Кстати, а строка
files=250,
помещённая в autoexec.bat, у тебя нормально отрабатывается? Ты ничего не перепутал?
XXXX Pro
01-02-2003, 23:06
Несколько дополнений и уточнений:
1) программа MODE резидентно не загружается, поэтому ее вовсе не требуется загружать с помощью INSTALLHIGH, а можно загрузить обычным способом в INSTALL.BAT
2) сам файл WIN.COM берет 3 Kb (или больше?) памяти, поэтому лучше блокировать его загрузку при запуске компьютера (в MSDOS.SYS писать BootGUI=0) и начинать работать в DOS, а Windows грузить при необходимости командой WIN.
3) можно написать FCBS=4,0 (кажется, под них память тогда вообще не выделитмя)
4) BUFFERS=9,256 - вполне достаточно, если используется SMARTDRV.EXE (кстати, его можно запускать с параметром /U, это позволит избавиться от модуля кеширования CD-ROM, что освободит несколько лишних Kb в UMB).
5) количество файлов вполне можно уменьшить до 40 (а то и меньше, это от конкретных условий зависит).
И поменять стандартные кириллизаторы на что-нибудь другое --- жрут память десятками килобайт.
С XXXX Pro соглашусь, но лишь частично.
> 2) сам файл WIN.COM берет 3 Kb (или больше?) памяти,
> поэтому лучше блокировать его загрузку при запуске
> компьютера (в MSDOS.SYS писать BootGUI=0) и начинать
> работать в DOS, а Windows грузить при необходимости
> командой WIN.
Если человек собирается работать без графического интерфейса Windows, то да. Если DOS-программы запускаются из Windows, то - однозначно нет.
Дамп при BootGUI=1:
-------------------------------
00A13 80 (0K) MSDOS System Program
00A18 176 (0K) COMMAND Data
00A23 80 (0K) vmm32 Data
00A28 32 (0K) WIN Data
00A2A 96 (0K) vmm32 Data
00A30 6 944 (7K) KEYB Program
00BE2 4 688 (5K) DOSKEY Program
00D07 272 (0K) WIN Environment
00D18 3 424 (3K) WIN Program
00DEE 288 (0K) vmm32 Program
00E00 320 (0K) COMMAND Data
00E14 8 624 (8K) COMMAND Program
0102F 1 440 (1K) COMMAND Environment
01089 336 (0K) MEM Environment
0109E 90 464 (88K) MEM Program
026B4 492 736 (481K) MSDOS -- Free --
-------------------------------
Дамп при BootGUI=0, графический интерфейс запускался через win.com:
-------------------------------
00A13 80 (0K) MSDOS System Program
00A18 272 (0K) WIN Environment
00A29 112 (0K) vmm32 Data
00A30 6 944 (7K) KEYB Program
00BE2 4 688 (5K) DOSKEY Program
00D07 8 624 (8K) COMMAND Program
00F22 1 440 (1K) COMMAND Environment
00F7C 2 048 (2K) WIN Program
00FFC 4 160 (4K) vmm32 Program
01100 320 (0K) COMMAND Data
01114 5 536 (5K) COMMAND Program
0126E 1 440 (1K) COMMAND Environment
012C8 336 (0K) MEM Environment
012DD 90 464 (88K) MEM Program
028F3 483 536 (472K) MSDOS -- Free --
-------------------------------
Со всем остальным, в принципе, согласен. Про второй параметр FCBS не знал.
Что касается MODE, то, разумеется, можно выполнять её и в autoexec.bat. Просто мне как-то давным-давно зачем-то потребовалось включить её именно в config.sys. И с тех пор оно так там и осталось.
Всем спасибо за советы, как доберусь до работы - обязательно все проверю - о результатах сообщу. Насчет параметра files=250 - о его расположении вполне мог ошибиться, а вот о значении - таково требование разработчиков. Сами обалдели, но попытка его уменьшить даже до 200 - приводила к тому, что прога вылетала по ошибке в самый неподходящий момент :( Вот так.
В конце концов, даже FILES=250 - это не так страшно. На этом ты теряешь 14 кбайт, которые вполне можно запихнуть в UMB путём использования FILESHIGH:
-------------------------------------------
Upper Memory Detail:
Segment Region Total Name Type
------- ------ ---------------- ----------- --------
0D15C 1 17 984 (18K) IO System Data
14 464 (14K) FILES=250
80 (0K) FCBS=1
1 072 (1K) BUFFERS=2
2 288 (2K) LASTDRIVE=Z
0D5C0 1 192 (0K) vmm32 Data
0D5CC 1 4 688 (5K) DOSKEY Program
0D6F1 1 37 104 (36K) vmm32 Data
-------------------------------------------
Даже на моём ноутбуке они туда поместились - с учётом того, что даже с ключом highscan emm386 находит у меня только 58 кбайт Upper Memory.
Успехов!
mazepkstan
03-02-2003, 23:48
Cursed
попытка его уменьшить даже до 200 - приводила к тому, что прога вылетала по ошибке в самый неподходящий момент
А что ты хотел от проги на Clipper'e? Скорее всего - бухгалтерская: куча баз (dbf) + ещё бОльшая куча индексов к каждой (idx, cdx, ...). Ты ограничиваеш максимальное количество открытых файлов - прога неможет открыть базу/индекс - и рушится.
А вообще, объясни подробнее:
1) на кой тебе именно 620 кил? Какую прогу ты собираешься запустить?
2) как именно ты хочешь грузить свою супер_пупер_ресурсоёмкую_прогу - из DOC'a до загрузки Виндов или в Виндах в DOC-режиме?
mazepkstan
Для начала - прога, сделанная под заказ давным-давно, после чего она дорабатывалась. Эти доработки привели к тому, что при выполнении некоторых операций она просто стала вываливаться по ошибке "Мало памяти". Прога эта довольно спокойно работает под ДОС 6.22 и Виндами 2000, а вот под 9X... Естественно, гружу ее по самими виндами.
mazepkstan
05-02-2003, 21:47
А для неё ты сделал файл имя_проги.pif?
Если да, то может в нём поправить параметры какие-нибудь? Например, на вкладке ""Память"-полный объем обычной/EMS/XMS - увеличить?
В общем - не знаю что делать, но больше чем 610 выжать не удалось :( Даже если избавиться от QEMM, который сам съел 3kb, но все остальное загнал в верхнюю память, больше этого освободить не удалось. Вот отчет mem:
Сведения о распределении обычной памяти:
Сегмент Размер Имя Тип
------- ---------------- ----------- --------
00000 1 024 (1K) Вектор прерываний
00040 256 (0K) Область обмена ПЗУ
00050 512 (1K) Область обмена DOS
00070 1 424 (1K) IO Системные данные
CON Драйвер системного устройства
AUX Драйвер системного устройства
PRN Драйвер системного устройства
CLOCK$ Драйвер системного устройства
A: - D: Драйвер системного устройства
COM1 Драйвер системного устройства
LPT1 Драйвер системного устройства
LPT2 Драйвер системного устройства
LPT3 Драйвер системного устройства
CONFIG$ Драйвер системного устройства
COM2 Драйвер системного устройства
COM3 Драйвер системного устройства
COM4 Драйвер системного устройства
000C9 5 184 (5K) MSDOS Системные данные
0020D 3 776 (4K) IO Системные данные
768 (1K) QEMM386$ Device=QEMM386
2 960 (3K) DblBuff$ Device=DBLBUFF
002F9 16 (0K) MSDOS Системная программа
002FA 80 (0K) MSDOS Системная программа
002FF 32 (0K) WIN Данные
00301 288 (0K) WIN Переменные средыДанные
00313 3 552 (3K) WIN Программа
003F1 48 (0K) vmm32 Данные
003F4 4 288 (4K) vmm32 Программа
00500 336 (0K) COMMAND Данные
00515 8 624 (8K) COMMAND Программа
00730 1 440 (1K) COMMAND Переменные средыДанные
0078A 336 (0K) MEM Переменные средыДанные
0079F 90 464 (88K) MEM Программа
01DB5 533 664 (521K) MSDOS -- Свободно --
Сведения о распределении верхней области памяти:
Сегмент Область Размер Имя Тип
------- ------ ---------------- ----------- --------
0B3FF 1 13 312 (13K) FILES Программа
0B73F 1 3 056 (3K) vmm32 Данные
0C101 2 8 320 (8K) IO Системные данные
8 288 (8K) CON Device=DISPLAY
0C309 2 336 (0K) vmm32 Данные
0C31E 2 6 944 (7K) KEYB Программа
0C4D0 2 13 024 (13K) vmm32 Данные
0C901 3 560 (1K) IO Системные данные
0C924 3 624 (1K) IFS Программа
0C94B 3 272 (0K) FCBS Программа
0C95C 3 528 (1K) WKBUFFER Программа
0C97D 3 2 304 (2K) LASTDRIV Программа
0CA0D 3 272 (0K) INSTALL Программа
0CA1E 3 105 984 (104K) vmm32 Данные
0E901 4 10 736 (10K) BUFFERS Программа
0EBA0 4 1 504 (1K) vmm32 Данные
0FC01 5 2 880 (3K) IO Системные данные
2 848 (3K) IFS$HLP$ Device=IFSHLP
0FCB5 5 3 088 (3K) STACKS Программа
0FD76 5 2 176 (2K) vmm32 Данные
0FF01 6 240 (0K) DOS-UP Программа
0FF10 6 2 368 (2K) vmm32 Данные
Сведения о памяти:
Тип памяти Размер Занято Свободно
---------------- ----------- ----------- -----------
Обычная 655 360 31 232 624 128
Верхняя 178 560 178 560 0
Зарезервировано 0 0 0
Память XMS 32 196 224 341 632 31 854 592
---------------- ----------- ----------- -----------
Всего памяти: 33 030 144 551 424 32 478 720
Ниже 1 МБ: 833 920 209 792 624 128
Дескриптор Имя EMS Размер
------- -------- ------
0 09C000
Всего отображаемой памяти (EMS): 32 571 392 (31M)
Свободно отображаемой памяти (EMS): 16 777 216 (16M)
Память, доступная через прерывание Int 15h: 0 (0K)
Максимально допустимый размер программы: 624 112 (609K)
Наибольший свободный блок верхней памяти: 0 (0K)
Резидентная часть MS-DOS загружена в сегмент HMA.
Версия XMS: 3.00; версия драйвера: 3.95
Версия EMS: 4.00
А если значение buffers обнулить - это как повлияет на систему?
Исправлено: Cursed, 21:58 5-02-2003
mazepkstan
05-02-2003, 22:19
Cursed
после чего она дорабатывалась. Эти доработки привели к тому, что при выполнении некоторых операций она просто стала вываливаться по ошибке "Мало памяти"
Все языки группы dBase (dBase, FoxBase,Clipper, да и FoxPro) - процедурные. При доработке проекта разными программистами весь проект обычно засирается глобальными переменными, как следствие - забивается стек (о чём никто не думает - это ведь не Си какой-нибудь)="out of memory".
Как разновидность последствий доработки - в проге где-то может появиться ошибка, которая вылазиет при каких-то условиях, редко. Отследить бывает очень трудно.
Хотя, если она нормально работает под DOS - сделай дамп памяти в чистом DOSе - сколько там свободно?
Да, и ещё. А ошибку сэмулировать можно? Т.е. известна ли последовательность операций при работе с прогой после которых появляется ошибка нехватки памяти?
mazepkstan
известна ли последовательность операций при работе с прогой после которых появляется ошибка нехватки памяти?
Вообще это всегда (за очень редким исключением) одно и тоже - когда создается, грубо говоря, отчет, содержащий в себе большое число данных, либо когда создается "очень сложный" отчет, опять таки, с большим количеством информации.
1. Попробуй найти и вписать в autoexec.bat русификатор keyrus. Тогда можно будет выкинуть все mode con, display.sys и keyb.com.
2. У тебя SCSI HDD? Если нет, то зачем DBLBUFF? Впиши в msdos.sys в раздел [Options] следующие строки:
DblSpace=0
DoubleBuffer=0
DrvSpace=0
Сначала только сними с него атрибут "только чтение"
Кстати, файл drvspace.bin можешь тогда вообще удалить.
3. DOS=HIGH в config.sys присутствует?
4. В config.sys проверь наличие:
FCBSHIGH=1,0
Добавлено:
Я бы предложил следующее построение конфигурационных файлов.
******** CONFIG.SYS ********
dos=high,umb,noauto
device=C:\WINDOWS\himem.sys /testmem:off
fileshigh=250
fcbshigh=1,0
buffershigh=12
stackshigh=9,256
lastdrivehigh=Z
Country=007,866,C:\WINDOWS\COMMAND\country.sys
device=C:\WINDOWS\emm386.exe noems verbose ram
device=c:\windows\ifshlp.sys
******** AUTOEXEC.BAT ********
@ECHO OFF
set TEMP=C:\TEMP
set TMP=C:\TEMP
SET PATH=C:\ARC;C:\UTL;C:\VC;C:\NC
lh C:\UTL\keyrus.com
Какой-то мизерный выигрыш это всё даёт, но он слишком мал, чтобы отвоевать даже 620 свободных килобайт. Боюсь, ты уже достиг предела.
Кстати, а программа случайно не умеет работать с EMS? Тогда можно было бы ей выделить, и пусть себе юзает...
Yozh
Кстати, а программа случайно не умеет работать с EMS?
А как это можно определить? И кстати, загадка, лично для меня во всяком случае - почему под W2k работает нормально без сбоев и вылетов, если учитывать, что mem выдает свободными 600 килобайт. Единственное что происходит - это сумашедшая загрузка процессора, но это решается с помощью доп. утилит.
А как это можно определить?
Добавлено:
Она вообще под DOS, без загруженной винды, работать сможет?
Тогда загружаемся с config.sys, где есть строка с emm386, но без параметра noems (в этом случае будет эмулироваться некоторое количество EMS-памяти). И проверь, сможет ли программа в этом случае запуститься и нормально работать. То же самое можешь сделать в Windows: создай для программы PIF (как ярлык), разреши в его свойствах EMS и запусти.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.