32 МБ хватит на всех
Максагор/NedoPC group
Только когда долго эксплуатируешь ту
или иную ОС, можно досконально изучить все
её особенности, достоинства и недостатки,
вплоть до глюков и ошибок. Это банальная
истина,но именно это позволило найти такой
недостаток в ATM-реализации ОС CP/M v2.2,
о котором вот так просто предположить было
нельзя.
* * *
Чтобы была понятна суть недостатка,
кратко пробегусь по структуре организации
дисковых устройств в данной версии ОС.
Всего в системе может быть до8 драйве─
ров с номерами от0 до 7. При этом:
- номера драйверов0,6и7были зарезер─
вированы под будущие расширения и не испо─
льзовались;
-5(NETdisk - сетевой диск)был заявлен
в документации, но на данный момент неиз─
вестна прошивка ПЗУ,где он был бы реализо─
ван;
-1(ROM-диск)был встречен мной только
один раз в специальной "увеличенной" ПЗУ
объёмом в256 КБдля ATM-turbo 2+;
-4(HDD)имеется в наличии только в ПЗУ
ATM-turbo 2(+);
- и только драйвера под номерами2(RAM-
диск) и 3(FDD)имеются в прошивках для
всех типов АТМ.
Путём подключения к данным драйверам
описателей блочных устройств можем полу─
чить разные диски или разделы на дисках.
Всего таковых РАЗНЫХ описателей-каналов
в ядре системы может быть создано10 (де─
сять).
В свою очередь, эти 10 каналов можно
подключить к16 (ШЕСТНАДЦАТИ) буквам логи─
ческих дисков-устройств (A: B: C: D:... N:
O: P:). При этом,учитывая,что каналов-опи─
сателей меньше, чем логических дисков, то─
лько максимум10 дисков будут независимыми
друг от друга,а дополнительные диски можно
задействовать, если,например,в целях боль─
шего удобства в копировании назначать не─
которые каналы сразу на несколько дисков.
Например,привязать флоппи-дисковод0 сразу
к буквам A: и C:, а флоппик1 - к буквам
B:, D: и K:, и т.д.
Вот с таким набором и приходится иметь
дело в CP/M на машинах линейки ATM. И если
при работе на ATM-turbo 1, где из реально
существующих дисков есть только FDD и
RAM-диск и, по факту, реально мной исполь─
зовались только буквы A: B: C: (собственно
RAM-диск и два флопика), то всё измени─
лось, когда я пересел на ATM-turbo 2+, где
присутствует Его Величество Винчестер.
В CP/M нет полноценных каталогов,поэто─
му огромное количество файлов быстро прев─
ращаются в бессвязную кашу,в которой труд─
но что-либо найти. Плюс, чем больше файлов
в каталоге,тем всё больше тормозит система
при попытке его обработать. В итоге, зача─
стую, скорость работы программы с винтом
может, при большом числе файлов в каталоге
упасть почти до скорости работы флопа в
том же TR-DOS.
Поэтому в мануалах по работе с винчес─
тером в CP/M на АТМ не зря обращалось осо─
бое внимание на нерекомендуемость созда─
вать слишком объёмные разделы на винте и
слишком большие области каталога.Наоборот,
рекомендовалось делать изначальный, систе─
мный раздел винта с наиболее базовыми и
часто встречающимися файлами и файлами на─
строек не больше1-2 МБ и каталогом в 128
файлов,а остальные уж как получится, то не
более512, максимум 1024 файла в каталоге.
При этом путём "метода проб и ошибок" я
пришёл к заключению, что максимальный раз─
мер раздела,с которым имеет смысл работать
-8 МБ и 512 файлов в каталоге.
В общем, послушав советы в мануалах, я
создал карту дисков так, как там написано.
Сначала сделал так же, как и в АТМ 1
(разве что там RAM-диск меньше на512 КБ):
- A: -RAM-диск в944 КБ(он на этой бу─
кве изначально после запуска.Переназначить
можно, но по причинам, лежащим вне данной
статьи, это нерационально);
- B: -FDD 0(640 КБ);
- C: -FDD 1(640 КБ).
А дальше я планировал следующие разделы
винта (их объём указан округлённо):
- D: -HDD-partition 1(1 МБ, 128 файлов
в каталоге) - тот самый системный раздел;
- E: -HDD-partition 2(4 МБ, 256 файлов
в каталоге) - тоже системный, чуть больше;
- F: -HDD-partition 3(8 МБ, 512 файлов
в каталоге);
- G: -HDD-partition 4(8 МБ, 512 файлов
в каталоге);
- H: -HDD-partition 5(8 МБ, 512 файлов
в каталоге);
- I: -HDD-partition 6(8 МБ, 512 файлов
в каталоге);
- J: -HDD-partition 7(8 МБ, 512 файлов
в каталоге).
И вот тут-то я и столкнулся с глюком.
Разделы D-H создавались и открывались нор─
мально, а вот попытки открыть созданные
разделы I-J (хоть в оболочке прочитать ка─
талог,хоть просто в командной строке толь─
ко перейти на их букву) заканчивались ви─
сяком системы намертво. Она просто засты─
вала и переставала реагировать на всё вок─
руг, кроме сброса. Короче, полная "птица
обломинго".
Даже не было понятно, с чего начать
разбираться. Удалось только выяснить, что
если, к примеру, не назначать какую-то из
ранних букв (например, G: ), то тогда уда─
валось назначить диск из ранее "недоступ─
ных" букв.Также без проблем удавалось наз─
начить эти буквы на уже существующие кана─
лы - когда новая буква просто означала тот
же диск, что одна из предыдущих букв.
На этом когда-то исследования и были
прекращены. И было это более 10 лет назад.
Сегодня, когда доступны эмуляторы АТМ,
работающие с образами винчестера, что поз─
воляет в любой момент посмотреть, что про─
исходит в памяти, я вернулся к этой давней
полузабытой нерешённой проблеме и, создав
образ и разбив его на разделы, воспроизвёл
в точности эту ошибку, после чего полез в
отладчик эмулятора. До сути я докопался
довольно быстро.
И ошибка оказалась не совсем ошибкой,но
достаточно банальной. Вот в чём суть.
Ядро CP/M(CCP+BDOS+BIOS) в АТМ распо─
лагается по следующим адресам:
- #D400-#DCO5:CCP (интерпретатор коман─
дной строки,независим от железа,на котором
запускается);
- #DCOб-#E9FF:BDOS (диспетчер функций
DOS, независим от железа,на котором запус─
кается);
- #EAOO-#F7FF:BIOS (стандартная керналь
низкоуровневых "железозависимых" функций).
Сразу за этими частями ядра лежит ещё
область:
- #F800-#FFFF:System Monitor - монитор
наиболее низкоуровневых системных функций,
куда обращаются "железозависимые" функции
BIOS. Представляет собой керналь функций
по прямому доступу к низкоуровневым драй─
верам физических устройств ввода-вывода,
драйверу экранной консоли.
При этом раздел BIOS только отчасти
"забит" кодом. В конце его располагаются
области различных переменных - прежде все─
го описатели структуры подключенных дис─
ков, а область размером в2048 байт, непо─
средственно прилегающая к областиSystem
Monitor (#F000-#F7FF) отведена под т. н.
"вектора размещения блоков" подключенных
дисков.
Другими словами,здесь размещаются карты
заполнения дисков, которые не хранятся на
самих дискетах (вродеFAT в MS-DOS ),а вы─
числяются системой посредством анализа ка─
талога вновь выбираемого диска - при этом
под каждый логический блок выделяется1
бит. Если блок свободен -бит=0, если за─
нят - равен1. Один логический блок может,
теоретически,изменяться программно при со─
здании дисковых описателей,но по умолчанию
всегда системой выставляется равным2048
байт или2 КБ.
При этом существующими утилитами, зани─
мающимися подключением новых дисков и опи─
сателей к дисковым каналам (@.COM, AS.COM,
ASS.COM,ASSIGN.COM,FDISK.COM) можно менять
только такие параметры, как число головок,
секторов, дорожек и размер физических сек─
торов, да количество файлов в каталоге, но
не размер логического блока.
Таким образом, на текущий момент можно
считать размер такого блока в2048 байт
как данность. В карте диска такой блок за─
нимает1 бит. Значит, на 8 блоков (16 КБ в
сумме) придётся1 байт битовой карты.
По мере подключения новых и новых кана─
лов дисков в рамках общей области #F000-
#F7FF одному каналу за другим выделяется
пропорциональное размеру дисков место.Так,
битовая карта флоппи-дискеты размером в
640 КБ займёт40 байт. Начало битовой об─
ласти каждого из подключенных дисков запо─
минается и может быть получено программис─
том по функцииBDOS27.
Нетрудно подсчитать,что вся эта область
в2048 байт в сумме позволит адресовать
16384 блока или32768 килобайт (32 мегаба─
йта) для всех подключенных дисковых кана─
лов В СУММЕ.
А что будет, если попытаться превысить
этот объём?
В моем случае,когда я подключал (см.та─
бличку выше) дискиA(RAM),B, C(FDD),D,
E, F,G, H(HDD) общий объём составил30896
КБ, т.е. почти приблизился к заветной гра─
нице.Подключение ещё одного раздела винче─
стера, объёмом 8 МБ (8192 КБ) однозначно
превышало оставшийся незанятым объём выде─
ленной под вектора размещения блоков обла─
сти - заканчивающейся, как уже говорилось,
на байте #F7FF. Как оказалось, в системе
нет контроля за переполнением данной обла─
сти.
В результате,когда такое дополнительное
устройство подключалось, при попытке его
выбрать система,добросовестно обнуляя свою
часть области перед считыванием каталога
для анализа занятости диска,просто затира─
ла начинающийся с #F800 системный монитор
низкоуровневых функций,намертво вешая сис─
тему. Вот и всё.
Остаётся только вопрос - почему была
выделена такая маленькая область, учиты─
вая, что нумерация блоков основана на 16-
битной адресации, т. е. максимальное число
блоков на логическом устройстве может дос─
тигать65536, что только при размере блока
в2 КБ даёт максимальный размер одного ус─
тройства в128 МБ. И это если не увеличи─
вать размер самих логических блоков!
У меня есть предположение, что в своё
время, при создании системы,никто не мог и
представить таких объемов дисков, и посчи─
тали, что32 мегабайт под все подключенные
диски будет выше крыши.
Таким образом, перед нами очередное во─
площение классической "ошибки Билла Гейт─
са", который, рассуждая про объёмы ОЗУ,
якобы заявил, что"640 КБ хватит всем". А
вот не хватило - ни ОЗУ, ни зарезервиро─
ванного объёма в32 МБ для дисков.
* * *
Я ещё планирую в будущем поиграться-
таки размером логических блоков, для чего
придётся написать утилиту-настройщик.
А пока уважаемым читателям - пользова─
телям CP/M на АТМ настоятельная рекоменда─
ция тщательно считать общий объём создава─
емых дисков, и при этом самим решать, что
лучше - меньше разделов винта, но пообъём─
нее,или больше,но меньшего размера - лично
я предпочитаю теперь второе. Меньшие раз─
делы работают шустрее.
А если их не хватает,то никто не мешает
создать на винте какое угодно их количест─
во, только подключать их к конкретным бук─
вам дисков поочерёдно, по мере необходимо─
сти.
Всем успехов!
Other articles: