Info Guide
#12
31 декабря 2017 |
|
Системки - история операционной системы CP/M для Спектрума: ограничения (часть 2).
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 на АТМ настоятельная рекоменда─ ция тщательно считать общий объём создава─ емых дисков, и при этом самим решать, что лучше - меньше разделов винта, но пообъём─ нее,или больше,но меньшего размера - лично я предпочитаю теперь второе. Меньшие раз─ делы работают шустрее. А если их не хватает,то никто не мешает создать на винте какое угодно их количест─ во, только подключать их к конкретным бук─ вам дисков поочерёдно, по мере необходимо─ сти. Всем успехов!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября