:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №25 (09.09.2005) Просмотров: 8216
Автор: Сергей Баган. Рубрика: Читатель читателю. Номер: №25 (09.09.2005). Загрузка системы iS-DOS с винчестера, подключенного по стандарту (c) Nemo HDDДля того чтобы понять принцип загрузки системы и ее запуска сначала надо разобраться в строении самой системы. Начнем с системы iS-DOS Classic.Пример распределения памяти в is-dos Classic 0 ПЗУ BASIC-48 16384 экран 23296 программа exebat.com 23552 системные переменные 23900 программа mon.com (menu.com) 24000 область com-файлов 36000 кэш 43000 каналы 44000 резиденты и драйверы 50304 уровень 4 SHELL 54800 уровень 3 WIN 58472 уровень 2 COM 60726 уровень 1 DUD 63296 уровень 0 DOS Посмотрим, что же из памяти компьютера надо сохранять, чтобы потом можно было загрузить систему. Область для программы exebat.com в сохранении не нуждается, поскольку эта программа и так загружается каждый раз при запуске bat-файлов. Нам потребуются системные переменные TR-DOS, а также область каналов Бейсика, т.к. там хранится адрес обработчика RST #10 для 4-го канала, через который вызываются все рестарты iS-DOS. Системные переменные TR-DOS нужны для работы с дискетой. Область памяти для программ mon.com и menu.com можно не сохранять по той же причине, что и для программы exebat.com. Область для com-файлов сохранять не нужно. Кэш сохранять не требуется, т.к. он и без того заново пересоздается при запуске системы. Остается область каналов и все, что выше. Вот эту область памяти необходимо обязательно сохранять. При этом остаются все ранее установленные драйверы и резиденты, а также там находится само ядро системы (уровни 4-0). Кроме того, нам необходимы каналы устройств. Именно так и работает программа sv.com. Кроме того, в этой области памяти находится обработчик прерываний режима IM 2. Таким образом, нам необходимо сохранить область системных переменных (о ней расскажем чуть позже) и ядро системы со всеми резидентами, драйверами и каналами (в файл is_dos.sys или *_dos.sys). Теперь посмотрим, как распределена память в iS-DOS Chic Пример распределения памяти в is-dos Chic #0010 RST #10 #003B подпрограмма драйвера электронного диска #0047 признак типа системы/компьютера #0069 таблица для драйвера электронного диска #0101 буфер для драйвера электронного диска #0201 знакогенератор t64 (1K) #0601 не используется #093A ядро системы (неизменяемая часть) #3800 знакогенератор t42 (2K) #4000 экран #5B00 программа exebat.com #5C00 системные переменные #5D5C программа mon.com (menu.com) #5DC0 область com-файлов #A5A2 кэш (49 блоков) #D6F0 каналы #DAD8 резиденты и драйверы изменяемая часть #F365 уровень 4: SHELL #F78C уровень 3: WIN #FA88 уровень 2: COM #FC0C уровень 1: DUD #FDE6 уровень 0: DOS Как видим, система состоит из двух частей - изменяемой и неизменяемой. Неизменяемая часть расположена в нижней странице памяти (раздел CPU0, адреса #0000-#3FFF). Изменяемая часть расположена в адресах #4000-#FFFF. Неизменяемая часть один раз создается и записывается в файл is_dos.rom. В дальнейшей работе ее не потребуется заменять, она только загружается. А изменяемая часть с учетом предыдущего пункта (iS-DOS Classic) сохраняется с области каналов до конца памяти. Также сохраняется область системных переменных. Допустим, что файлы с системой сохранены на диске программой sv.com. Однако как его загрузить, если не знаем, где он расположен? У нас есть только один винчестер и больше ничего. Следовательно, нам надо ввести привязку месторасположения файла is_dos.sys к чему-нибудь, а именно к 0-му блоку устройства, где располагается файл is_dos.sys. Для введения такой привязки служит программа con.com. Она сохраняет описатель файла is_dos.sys в 0-м блоке текущего устройства по смещению +32 dec. Заодно она считает контрольную сумму этого самого описателя и сохраняет ее в том же самом блоке по смещению +27 dec. Теперь загрузив 0-й блок устройства можно узнать, где располагается файл is_dos.sys с сохраненной системой. Это решает только часть проблем. Откуда мы узнаем, где именно на винчестере располагается нужное нам устройство и вообще нем неизвестна конфигурация винчестера (количество головок, секторов и цилиндров). Можно было бы изначально в программу-загрузчик ввести конфигурацию винчестера, но она в таком случае окажется неуниверсальной, рассчитанной только под один тип винчестера. Тут все делается просто. Дело в том, что можно загрузить 0-й блок любого устройства, не зная конфигурации винчестера вообще. Такой блок будет располагаться на 1-м секторе и 0-й головке одного из треков винчестера. А 1-й сектор и 0-я головка есть у любого винчестера. Следовательно, нам надо только перебрать все треки винчестера и читать на них сектор 1 при выбранной головке 0 (нумерация секторов начинается с 1, головок с 0, треков с 0). Но устройств на винчестере может быть несколько, и неизвестно, какое из них было использовано как загрузочное. Для этого 0-й блок загрузочного устройства помечают особым образом, чтобы программа, сканирующая винчестер, сразу узнала, что это то устройство, которое нам надо. Стандартной программой для подключения системы для ее последующей загрузки с винчестера является программа uni_con.com. Она записывает в 0-й блок текущего устройства идентификатор «KAY» по смещению +127 dec. Именно по наличию такого идентификатора программа загрузчик определяет, что с данного устройства нужно загружать систему. Из этого следует, что загрузочное устройство на винчестере может быть только одно... До этого мы говорили про сохранение и загрузку ядра системы с набором драйверов и резидентов, расположенного в файле is_dos.sys. С этим все более-менее ясно. А вот как же поступить с системными переменными? Их тоже надо куда-то сохранять - без них запустить систему невозможно. В данном случае они сохраняются в отдельном файле, а именно совмещены с непосредственным загрузчиком системы. Сама загрузка и запуск системы с винчестера осуществляются в два этапа: предварительная загрузка с последующим определением параметров винчестера, затем загрузка непосредственно самой системы и ее запуск. Чтобы сохранить систему на винчестере и подключить ее для последующей загрузки нам потребуются: 1) программа sv.com для сохранения системы в файле на винчестере; 2) программа uni_con.com, которая подключает все нужные файлы к 0-му блоку устройства; 3) файл is_dos.rom, в котором хранится неизменяемая часть системы iS-DOS Chic (для подключения системы iS-DOS Classic требуется лишь формально); 4) загрузчик системы с винчестера uni_clas.sys (или uni_chic.sys для iS-DOS Chic), в дальнейшем переименовывается в файл uni_boot.sys; 5) загрузчик системы, который вызывается на исполнение из ПЗУ при включении компьютера. В компьютере KAY-1024 это hdd_boot, прошитый в ПЗУ. Его можно вызвать на выполнение при выборе соответствующего пункта меню. Для других компьютеров запуск системы возможен только в случае прошивки загрузчика в ПЗУ или если его предварительно загрузить с диска. Для системы iS-DOS Chic файлы is_dos.rom и is_dos.sys должны быть предварительно настроены под нужный тип компьютера (KAY, Profi, Scorpion и т.д.). Процесс настройки в данной статье не приводится. Он приведен в текстовых файлах на диске с базовым комплектом iS-DOS Chic. Порядок действий следующий: Сначала выбираем устройство, на котором будем сохранять систему, и с которого будем в последующем ее загружать. Единственное ограничение - номер трека устройства не должен быть более 255. Дело в том, что при сканировании винчестера программа перебирает треки 0-255. Чтобы узнать номер трека, на котором расположено устройство, нужно запустить программу ide_tune.com для текущего драйвера винчестера. На выбранном устройстве создается для удобства какой-нибудь каталог, куда копируются файлы: uni_con.com, is_dos.rom, uni_boot.sys (файл uni_clas.sys или uni_chic.sys переименовываются в зависимости от типа системы, которая подключается). Если подключается система iS-DOS Classic файл is_dos.rom должен присутствовать формально. То есть необязательно брать файл от системы iS-DOS Chic длиной 64 сектора, а просто создать, к примеру, в текстовом редакторе файл с таким же названием и любой длины. Этот файл требуется только при подключении iS-DOS Chic, но так как программа uni_con.com является универсальной, она проверяет наличие файла is_dos.rom в каталоге. Кстати, после загрузки системы с винчестера, этот файл можно будет удалить. В системе надо устройство S переключить на то устройство, где мы будем сохранять систему. Это делается потому, что программа uni_con.com подключает систему именно на устройство S. Система уже должна быть настроена (установлены необходимые драйвера и резиденты, установлен размер кэша). Затем система сохраняется программой sv.com в каталог, куда мы копировали файлы. Кстати, обязательно должен быть установлен резидент calc.res, иначе при работе программы uni_con.com будет ошибка. Наконец, запускается программа uni_con.com, которая проверяет все файлы и подключает к 0-му блоку устройства. После нормального завершения работы программы система станет загружаться с винчестера. Теперь рассмотрим подробно, что же делает программа uni_con.com. 1) проверяется присутствие файлов is_dos.sys, is_dos.rom и uni_boot.sys в том же каталоге; 2) сохраняются в 0-м блоке контрольные суммы файлов is_dos.sys и is_dos.rom и сами описатели; 3) сохраняется признак загрузочного устройства «KAY» в 0-м блоке; 4) по номеру текущего устройства определяется драйвер устройства, и если это драйвер винчестера, то конфигурация винчестера из драйвера записывается в 0-й блок устройства; 5) системные переменные системы (с #5C00 длиной 512 байт) сохраняются в файл uni_boot.sys; 6) подсчитывается контрольная сумма файла uni_boot.sys (он ведь был изменен); 7) файл uni_boot.sys защищается от удаления, чтения и записи. Это для того, чтобы программа arzt+.com не передвинула этот файл куда-нибудь или чтобы его случайно не удалили. Очень важно, чтобы этот файл оставался на одном и том же месте - ведь на его расположение есть ссылка в 0-м блоке устройства. Кстати, с файлом is_dos.sys этого не делается, потому что arzt+.com сама отслеживает изменение месторасположения этого файла и изменяет 0-й блок устройства. Теперь посмотрим, что же система сохраняет в 0-м блоке устройства: Байт Длина Описание 27 1 Контрольная сумма описателя is_dos.sys 28 2 Байты 8 и 7 из вектора конфигурации системы. Назначение их неизвестно. 32 32 Описатель is_dos.sys 64 32 Описатель is_dos.rom 96 1 Контрольная сумма описателя is_dos.rom 97 24 Часть драйвера винчестера, где находится информация о структуре винчестера и его характеристиках 125 3 Признак "KAY" 128 32 Описатель uni_boot.sys Осуществляется при вызове загрузчика hdd_boot из ПЗУ компьютера. Как уже упоминалось выше, без знания параметров винчестера можно загрузить с любого трека 1-й сектор с 0-й головкой. Последовательно перебираются 1-е сектора на каждом треке с 0 по 255. Если все треки перебраны, то программа «виснет». Ограничение количества треков числом 255 обусловлено использованием одного байта для счетчика треков. Конечно, можно было ввести два байта для счетчика треков, однако представьте себе, что будут перебираться несколько сот треков на винчестере. Времени это займет очень много. Если на считанном блоке обнаруживается признак загрузочного устройства «KAY», то из этого блока берется конфигурация винчестера и заносится в загрузчик. Теперь, зная конфигурацию винчестера, можно уже читать любое количество информации с него. Теперь можно взять информацию о непосредственном загрузчике системы uni_boot.sys, программа загружает его в память и запускает на выполнение. Теперь начинается загрузка непосредственно самой системы. Кстати, 0-й блок уже загружен в память программой hdd_boot. Процессы загрузки iS-DOS Classic и Chic несколько различаются. Программа uni_boot.sys (для системы Classic) делает следующее: 1) берет из 0-го блока информацию о файле is_dos.sys и загружает его в память (предварительно устанавливается 0-я банка памяти). 2) устанавливается вектор прерывания системы из 0-го блока (находится в описателе файла is_dos.sys по смещению +22 dec); 3) системные переменные (занесенные в файл uni_boot.sys программой uni_con.com) переносятся из тела программы в память по адресу #5C00; 4) система уже в памяти, системные переменные перенесены, становится доступно обращение к рестартам системы через RST #10, поэтому определяем размер электронного диска в блоках и создаем сам электронный диск (кэш); 5) дата из 0-го блока переносится в систему; 6) переключаемся на устройство «S», с которого и сохранялись; 7) выходим в систему с запуском autoexec.bat. Для загрузки iS-DOS Chic процесс загрузки несколько меняется: 1) Устанавливаем банк 8 памяти в раздел CPU3, в раздел CPU0 включается банк 0 ОЗУ. Кстати, для KAY и PROFI загрузчики должны быть разные, т.к. в KAY используется порт #1FFD, а в PROFI - порт #DFFD. 2) Берем информацию о файле is_dos.rom и загружаем файл в под-ПЗУшную область; 3) берет из 0-го блока информацию о файле is_dos.sys и загружает его в память (предварительно устанавливается 0-я банка памяти). 4) устанавливается вектор прерывания системы из 0-го блока (находится в описателе файла is_dos.sys по смещению +22 dec); 5) системные переменные (занесенные в файл uni_boot.sys программой uni_con.com) переносятся из тела программы в память по адресу #5C00; 6) система уже в памяти, системные переменные перенесены, становится доступно обращение к рестартам системы через RST #10, поэтому определяем размер электронного диска в блоках и создаем сам электронный диск (кэш); 7) дата из 0-го блока переносится в систему; 8) переключаемся на устройство «S», с которого и сохранялись; 9) выходим в систему с запуском autoexec.bat. * * * При написании статьи использованы материалы по iS-DOS, опубликованные в электронном издании ZX-Format 5, описания рестартов системы из приложения к диску с iS-Assembler, а также исходные тексты программ uni_con.com, uni_clas.sys, uni_chic.sys, hdd_boot.com. P.S. Тем, кто желает ознакомиться с полной версией статьи следует заказать себе сборник «iS-files» № 3, № 4, где данная статья опубликована со всеми приложениями. |