PDA

Показать полную графическую версию : Война за первые 640 kb памяти


Страниц : [1] 2

Cursed
31-01-2003, 17:32
Кто-нибудь боролся за первые 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

Cursed
01-02-2003, 00:53
mazepkstan
Для нормальной работы надо 610-620 кб _минимум_ :(  Поэтому и спрашиваю.  Едиственное, что можно, как мне кажется - это избавиться от всего лишнего в загрузке, и что лезет куда не надо. А вот что конкретнее - вопрос.

Исправлено: Cursed, 0:54 1-02-2003

Yozh
01-02-2003, 02:16
А что у тебя там вообще есть-то сейчас?
Если хочешь побольше памяти, запускай 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+
Но он откусит много памяти.
Что ещё там у тебя есть?

Cursed
01-02-2003, 05:12
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 - теперь до понедельника :(

Yozh
01-02-2003, 15:29
Во-первых. Вместо того чтобы гадать на кофейной гуще, выполни команду
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 (а то и меньше, это от конкретных условий зависит).

Kinder
02-02-2003, 01:16
И поменять стандартные кириллизаторы на что-нибудь другое --- жрут память десятками килобайт.

Yozh
02-02-2003, 03:11
С 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. И с тех пор оно так там и осталось.

Cursed
02-02-2003, 21:35
Всем спасибо за советы, как доберусь до работы - обязательно все проверю - о результатах сообщу. Насчет параметра files=250 - о его расположении вполне мог ошибиться, а вот о значении - таково требование разработчиков. Сами обалдели, но попытка его уменьшить даже до 200 - приводила к тому, что прога вылетала по ошибке в самый неподходящий момент :(  Вот так.

Yozh
03-02-2003, 01:44
В конце концов, даже 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-режиме?

Cursed
04-02-2003, 02:07
mazepkstan
Для начала - прога, сделанная под заказ давным-давно, после чего она дорабатывалась. Эти доработки  привели к тому, что при выполнении некоторых операций она просто стала вываливаться по ошибке "Мало памяти". Прога эта довольно спокойно работает под ДОС 6.22 и Виндами 2000, а вот под 9X... Естественно, гружу ее по самими виндами.

mazepkstan
05-02-2003, 21:47
А для неё ты сделал файл имя_проги.pif?
Если да, то может в нём поправить параметры какие-нибудь? Например, на вкладке ""Память"-полный объем обычной/EMS/XMS - увеличить?

Cursed
05-02-2003, 21:47
В общем - не знаю что делать, но больше чем 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е - сколько там свободно?

Да, и ещё. А ошибку сэмулировать можно? Т.е. известна ли последовательность операций при работе с прогой после которых появляется ошибка нехватки памяти?

Cursed
05-02-2003, 22:36
mazepkstan
известна ли последовательность операций при работе с прогой после которых появляется ошибка нехватки памяти?
Вообще это всегда (за очень редким исключением) одно и тоже - когда создается, грубо говоря,  отчет, содержащий в себе большое число данных, либо когда создается "очень сложный" отчет, опять таки, с большим количеством информации.

Yozh
05-02-2003, 23:12
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? Тогда можно было бы ей выделить, и пусть себе юзает...

Cursed
06-02-2003, 00:35
Yozh
Кстати, а программа случайно не умеет работать с EMS?
А как это можно определить? И кстати, загадка, лично  для меня во всяком случае - почему под W2k работает нормально без сбоев и вылетов, если учитывать, что mem выдает свободными 600 килобайт. Единственное что происходит - это сумашедшая загрузка процессора, но это решается с помощью доп. утилит.

Yozh
06-02-2003, 03:01
А как это можно определить?



Добавлено:

Она вообще под DOS, без загруженной винды, работать сможет?
Тогда загружаемся с config.sys, где есть строка с emm386, но без параметра noems (в этом случае будет эмулироваться некоторое количество EMS-памяти). И проверь, сможет ли программа в этом случае запуститься и нормально работать. То же самое можешь сделать в Windows: создай для программы PIF (как ярлык), разреши в его свойствах EMS и запусти.




© OSzone.net 2001-2012