Абзац
:: Поиск
:: ПоддерЖка ПрОекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №25 (09.09.2005) ПрОсмотрОв: 5703

    Автор: Сергей Баган.

    Рубрика: Читатель читателю.

    Номер: №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, где данная статья опубликована со всеми приложениями.

    © 2004-2013 Perspective group