
Dos7book
.pdf
Приложение А.12: Управление выделением и обслуживанием памяти
Смещение |
Длина |
Содержание |
00h |
4 |
Целевой адрес перехода (сегмент : смещение) |
04h |
1 |
Длина новой таблицы соответствия страниц |
05h |
4 |
Адрес новой таблицы соответствия страниц |
09h |
1 |
Длина заменяемой таблицы соответствия страниц |
0Ah |
4 |
Адрес заменяемой таблицы соответствия страниц |
– |
8 |
(резервировано для драйвера Emm386.exe) |
Примечание 1: структура таблиц соответствия логических и физических страниц показана в примечании 3 к INT 67\AH=5000h (8.03-66). Сведения о действующей (заменяемой) таблице соответствия необходимы для
возврата к исполнению вызывающей программы после завершения исполнения вызванной подпрограммы.
A.12-7 Дескрипторы блоков памяти.
Распределением памяти в компьютере "заведует" операционная система. Перед каждым блоком памяти, который выделяет DOS, она формирует 16-байтовый дескриптор. В зарубежной литературе его принято называть MCB (= Memory Control Block). Найти MCB просто: его сегментный адрес всегда на единицу меньше сегментного адреса того блока памяти, к которому этот MCB относится.
По дескрипторам блоков памяти DOS прослеживает всю доступную ей память (подробнее об этом – в примечании 3). Отдельным блоком памяти DOS считает свободное пространство за пределами занятых областей: ему также должен предшествовать дескриптор, отличительным признаком которого является код 0000h вместо адреса программы-владельца. Все сведения об имеющейся свободной памяти и о конкретном расположении свободных участков DOS получает из прослеживаемой последовательности дескрипторов блоков памяти.
Структура дескриптора блока памяти показана в приведенной ниже таблице.
Смещение |
Длина |
Содержание |
Примечания |
00h |
1 |
4Dh (= M) – не-последний MCB |
*1 |
|
|
5Ah (= Z) – последний MCB в цепи |
|
01h |
2 |
Сегмент программы-владельца |
*2 |
03h |
2 |
Размер блока памяти в параграфах |
*3 |
05h |
3 |
Не используются |
|
08h |
8 |
Имя файла программы |
*4 |
– 669 –

Приложение А.12: Управление выделением и обслуживанием памяти
Примечание 1: свой основной блок системных данных DOS разделяет на субблоки, имеющие такие же дескрипторы, но с другими идентификаторами в байте со смещением 00h:
42h (= B) – субблок буферов (4.03)
44h (= D) – субблок драйвера
45h (= E) – субблок данных для драйверов
46h (= F) – субблок SFT (4.12)
49h (= I) – субблок IFS
4Ch (= L) – субблок CDS (4.17) 53h (= S) – субблок стеков (4.27)
54h (= T) – субблок переходного кода
58h (= X) – субблок FCBS (4.10).
Примечание 2: если данный блок памяти свободен, то в слово дескриптора со смещением 01h записываются нули, а если данный блок DOS выделила самой себе, то туда вместо сегментного адреса программы заносится код 0008h.
Примечание 3: размер выделяемого блока памяти здесь указывается в 16-байтовых параграфах. Сегментный адрес дескриптора следующего блока
памяти на единицу больше суммы сегментного адреса данного дескриптора с числом, указанным в слове со смещением 03h. На основании этого соотношения DOS выполняет прослеживание всей цепи дескрипторов, начиная с дескриптора первого выделенного блока памяти. Сегментный адрес этого первого дескриптора указан в слове, непосредственно предшествующем "Списку Списков": оно отмечено в таблице A.01-2 как имеющее смещение –02h.
Примечание 4: имя программы заносится в дескрипторы блоков, выделенных для PSP программ, а также в дескрипторы драйверных субблоков и субблоков IFS. Начиная с байта 08h в дескрипторы некоторых блоков заносятся сигнатуры, которые означают следующее:
SC |
– блок принадлежит DOS и содержит код; |
SD |
– блок принадлежит DOS и содержит данные; |
SM |
– последний блок в области UMB; |
UMB – первый блок в области UMB.
В дескрипторах других блоков байты 08h – 0Fh не используются и могут содержать "мусор".
Примечание 5: у программ с суффиксом *.COM нет заголовков, из которых DOS могла бы "узнать" размер необходимой им памяти, и DOS выделяет им все имеющееся пространство памяти. Когда свободной памяти совсем не осталось, любой запрос от резидентной программы или от обработчика, вызванного внешним прерыванием, может привести к "зависанию" компьютера. Во избежание этого программы с суффиксом *.COM должны сами вызывать INT 21\AH=4Ah
– 670 –

Приложение А.12: Управление выделением и обслуживанием памяти
(8.02-52), чтобы DOS сформировала дескриптор, в котором неиспользуемая часть памяти была бы объявлена свободной. Примеры таких вызовов показаны в первых 6 строках ассемблерных текстов в разделах 9.06, 9.10-01 и 9.10-02.
A.13 Таблицы параметров жестких магнитных дисков
A.13-1 Параметры дисководов на жестких магнитных дисках
До 1996 года было принято адресовать операции с жесткими магнитными дисками посредством параметров CHS (Cylinder-Head-Sector). При такой адресации размер доступного дискового пространства ограничен величиной 528 Мбайт. Система BIOS хранила параметры CHS первого и второго дисководов на жестких магнитных дисках в блоках данных, адреса которых записаны в ячейки 0000:0104h и 0000:0118h соответственно. Обе эти ячейки находятся в пределах таблицы прерываний (A.12-1), и на них иногда ссылаются как на INT 41 и INT 46. Если в компьютере было больше двух дисководов на жестких магнитных дисках, то параметры CHS остальных дисководов можно было получить только посредством вызова INT 13\AH=08h (8.01-49).
К 1995 году объемы дисков уже достигли гигабайта, так что 528-мегабайтовый предел необходимо было преодолеть. Для новых программ были разработаны адресация LBA (примечание 4 к A.13-6) и новые функции прерывания INT 13 (8.01-55 – 8.01-60), а для сохранения совместимости со старыми программами обработчика прерывания INT 13\AH=08h (8.01-49) научили выдавать не реальные, а преобразованные параметры. Когда программы используют эти параметры при вызове старых функций прерывания INT 13 (8.01-46 – 8.01-54), тогда система BIOS, "подставившая" преобразованные параметры, сама выполняет обратное преобразование так, что дисковое пространство, доступное для CHS-адресации, расширяется до 8.4 Гбайт (подробнее – в примечании 2 к A.13-6).
Блоки данных, адреса которых записаны в ячейки 0000:0104h и 0000:0118h, могут содержать как реальные, так и преобразованные CHS-параметры, причем каждому варианту соответствует своя структура. Они обе показаны в приведенной ниже таблице. В первом столбце (Std) приведены смещения элементов данных в блоках с реальными CHS-параметрами. Во втором столбце (Trs) приведены смещения элементов данных в блоках, формируемых согласно уточненной спецификации, предложенной в 1995 году фирмой Phoenix для дисководов с числом цилиндров более 1024. Разрабатываемым в настоящее время программам не рекомендуется пользоваться сведениями из всех этих блоков данных.
– 671 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Std |
Trs |
Длина |
Содержание |
|
00h |
00h |
2 |
Число цилиндров дисковода (примечание 1) |
|
02h |
02h |
1 |
Число головок дисковода (примечание 1) |
|
|
03h |
1 |
Сигнатура A0h – отличительный признак блоков, |
|
|
|
|
отвечающих спецификации фирмы Phoenix |
|
|
04h |
1 |
Число секторов на дорожке (примечание 2) |
|
05h |
05h |
2 |
Начало предкомпенсации записи (примечание 3) |
|
08h |
08h |
1 |
Бит 2 – рекалибровка головок не производится |
|
|
|
|
бит 3 |
– число головок превышает 8 |
|
|
|
бит 5 |
– имеется карта дефектов (примечание 4) |
|
|
|
бит 6 |
– исключить повторы при сбоях ECC |
|
|
|
бит 7 |
– исключить попытки повторного доступа |
|
09h |
2 |
Число дорожек (до 65536, примечание 2) |
|
|
0Bh |
1 |
Число головок (до 16, примечание 2) |
|
0Ch |
0Ch |
2 |
Цилиндр парковки головок (примечание 3) |
|
0Eh |
0Eh |
1 |
Число секторов на дорожке (примечание 1) |
|
|
0Fh |
1 |
Контрольная сумма |
Примечание 1: в этих позициях даны CHS-параметры, предназначенные для использования при вызове старых функций прерывания INT 13 (8.01-46 – 8.01-54). Тем не менее некоторые версии BIOS могут указывать реальное число цилиндров свыше 1024, недопустимое при вызове старых функций прерывания INT 13.
Примечание 2: эти позиции заполнены только в преобразованном блоке данных.
Записанные в них параметры отражают истинные характеристики дисковода и предназначены для использования программами,
которые обращаются непосредственно к портам контроллера дисковода (а не через прерывание INT 13).
Примечание 3: современные дисководы выполняют предкомпенсацию и парковку самостоятельно. Попытки влиять на эти процессы игнорируются.
Примечание 4: карта дефектов поверхности дисков обычно записана на дорожке, номер которой на единицу превышает число цилиндров дисковода, указываемое в данной таблице в ячейке со смещением 00h.
A.13-2 Формат расширенной таблицы параметров
Представленная здесь таблица параметров запрошенного дисковода записывается в заранее подготовленный буфер обработчиком прерывания
INT 13\AH=48h (8.01-60).
– 672 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Смещение |
Длина |
Содержание |
00h |
2 |
При вызове: размер буфера (8.01-60) |
|
|
При возврате: длина заполненной части буфера |
02h |
2 |
Бит 0: ошибки DMA исправлять без остановок |
|
|
бит 1: сообщаемые данные CHS действительны |
|
|
бит 2: дисковод на сменных дисках, биты 4 – 6 |
|
|
действительны |
|
|
бит 3: поддержка записи с верификацией |
|
|
бит 4: дисковод регистрирует смену дисков |
|
|
бит 5: поддержка блокировки и разблокировки |
|
|
бит 6: диск не вставлен, CHS взяты из таблиц |
04h |
4 |
Число цилиндров в дисководе (примечание 1) |
08h |
4 |
Число головок дисковода (примечание 1) |
0Ch |
4 |
Число секторов на дорожке (счет с единицы) |
10h |
8 |
Число секторов в дисководе (оно на единицу |
|
|
больше, чем номер последнего сектора) |
18h |
2 |
Размер сектора в байтах |
1Ah |
4 |
Указатель на таблицу DPTE (примечание 2) |
1Eh |
2 |
= BEDDh: сигнатура наличия данных о пути |
20h |
1 |
= 2Ch: размер данных о пути, включая сигнатуру |
24h |
4 |
Системная шина (ISA или PCI) + пробел (20h) |
28h |
8 |
Тип интерфейса (примечание 3) |
30h |
8 |
Поле пути по системной шине (примечание 4) |
38h |
16 |
Поле пути к дисководу (примечание 5) |
49h |
1 |
Контрольная сумма байтов 1Eh – 48h |
Примечание 1: номера дорожек, цилиндров и головок считаются от нуля, поэтому
последний действительный номер на единицу меньше указанного здесь числа. Приведенные здесь параметры – реальные. При вызове старых функций прерывания INT 13 (8.01-46 – 8.01-54) следует пользоваться не реальными, а преобразованными параметрами, которые возвращает обработчик INT 13\AH=08h (8.01-49).
Примечание 2: расширения BIOS версии до 2.0 не предоставляют таблицы DPTE, а в поле указателя на нее записывают значение FFFF:FFFFh. Формат таблицы DPTE показан в приложении A.13-3. Таблица DPTE предоставляется во временном буфере, содержимое которого при последующих вызовах функций BIOS не сохраняется.
Примечание 3: в поле типа интерфейса допустимы только резервированные слова, в частности: 1394, ATA, ATAPI, SCSI, USB. Слова дополняются пробелами (знаками 20h) до полной длины поля 8 байтов.
– 673 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Примечание 4: для шины ISA поле пути по системной шине содержит двухбайтовый базовый адрес порта, а байты 32h – 37h обнулены. Для шины PCI байт 30h представляет номер шины, байт 31h – номер разъема (слота), байт 32h – номер функции, байт 33h – номер контроллера; байты 34h – 37h обнулены.
Примечание 5: для интерфейса 1394 (Firewire) начиная с байта 38h указан 8-байтовый идентификатор (EUI-64). Для интерфейса ATA (IDE) значением 00h байта 38h маркируется ведущее устройство (master), а значением 01h – ведомое устройство (slave). Для интерфейса ATAPI байт 38h имеет такое же назначение, как и для интерфейса ATA, но байт 39h представляет логический номер устройства (LUN). Для интерфейса SCSI начиная с байта 38h записывается двухбайтовый идентификатор устройства (SCSI ID), а начиная с байта 3Ah – 8-байтовый логический номер устройства (LUN). Для интерфейса USB начиная с байта 38h записывается 8-байтовый серийный номер. Для всех интерфейсов предполагается, что не упомянутые здесь байты (в пределах 3Ah – 48h) обнулены.
A.13-3 Дополнительная таблица DPTE
Расширения BIOS версии 2.0 и выше в дополнение к таблице A.13-2 параметров запрошенного дисковода предоставляют дополнительную таблицу DPTE (Device Parameter Table Extension), структура которой показана ниже. Адрес таблицы DPTE возвращается в ячейке со смещением 1Ah в расширенной таблице (A.13-2) обработчиком прерывания INT 13\AH=48h (8.01-60). Этот адрес указывает на временный буфер, содержимое которого при последующих вызовах функций BIOS не сохраняется. Данные в таблице DPTE предназначены для тех программ, которые обращаются непосредственно к портам контроллера дисковода.
Смещение |
Длина |
Содержание |
|
00h |
2 |
Базовый адрес порта запрошенного устройства |
|
02h |
2 |
Адрес порта управляющих регистров дисковода |
|
04h |
1 |
Флаги: биты 0-3 = 0b, биты 5 и 7 |
= 1b |
|
|
бит 4: = 0b – ведущий диск, = 1b |
– ведомый |
|
|
бит 6: = 1b, если разрешена адресация LBA |
|
06h |
1 |
Биты 0-3: номер IRQ, биты 4-7 сброшены |
|
07h |
1 |
Число секторов в многосекторных пересылках |
|
08h |
1 |
Биты 0-3: канал DMA, биты 4-7: тип DMA |
|
09h |
1 |
Биты 0-3: тип PIO, если в слове 0Ah бит 0 = 1b |
|
0Ah |
2 |
Бит 0: PIO исполняется, байт 09h действителен |
|
|
|
бит 1: пересылка посредством DMA разрешена |
– 674 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Продолжение таблицы А.13-3
бит 2: многосекторные пересылки разрешены бит 3: преобразование CHS осуществляется бит 4: преобразование для LBA выполняется бит 5: накопитель использует сменные носители бит 6: интерфейс ATAPI (обычно у CD-ROM) бит 7: 32-битовая пересылка разрешена
бит 8: сигнал готовности интерфейса ATAPI биты 9-10: тип преобразования CHS:
|
|
= 00 |
– посредством битовых сдвигов |
|
|
= 01 |
– посредством линейной адресации |
|
|
= 10, 11 – другие типы преобразования |
|
|
|
бит 11: пересылка "ultra DMA" разрешена |
|
0Eh |
1 |
Номер версии расширений INT 13 |
|
0Fh |
1 |
Контрольная сумма байтов 00h – 0Eh |
A.13-4 Формат пакета дисковой адресации
Этот формат пакета данных используется расширенными функциями считывания INT 13\AH=42h (8.01-56) и записи INT 13\AH=43h (8.01-57). Перед пользованием этими функциями необходимо с помощью INT 13\AH=41h (8.01-55) убедиться в том, что система BIOS их поддерживает.
Смещение |
Длина |
Содержание |
00h |
1 |
Длина пакета дисковой адресации (примечание 1) |
02h |
1 |
Число (до 7Fh) блоков данных (примечание 2) |
04h |
4 |
Указатель на буфер для данных (примечание 3) |
08h |
8 |
LBA-адрес 1-го блока данных (примечание 4) |
10h |
8 |
Указатель на буфер для данных (примечание 3) |
18h |
8 |
Число блоков данных (примечание 2) |
Примечание 1: длина пакета равна 20h, если расширенный формат пакета поддерживается, или 10h, если расширенный формат пакета не поддерживается. О поддержке расширенного формата можно узнать по биту 3 в регистре CX после вызова INT 13\AH=41h (8.01-55).
Примечание 2: если поддерживается расширенный пакет дисковой адресации, и если байт 02h имеет значение FFh, то число подлежащих передаче блоков данных будет считано начиная со смещения 18h. При
возврате число подлежащих передаче блоков данных заменяется числом фактически переданных блоков данных.
Примечание 3: если поддерживается расширенный пакет дисковой адресации, и если число в ячейке 04h имеет значение FFFF:FFFFh, то указатель на буфер будет считан начиная со смещения 10h.
– 675 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Примечание 4: для дисководов, не поддерживающих адресацию LBA (примечание 4 к A.13-6), номер начального блока рассчитывается по формуле
(C•N + H)•T + S – 1
где C – заданный цилиндр, N – число головок (на 1 больше максимального номера головки), H – номер заданной головки, T – число секторов на дорожке, S – номер заданного сектора.
A.13-5 Дескрипторы разделов жестких магнитных дисков
В секторе 01h дорожки 00h на стороне 00h загрузочного физического диска находится главная загрузочная запись MBR (Master Boot Record), содержащая до 436 байт исполняемого машинного кода, 4-байтовый идентификационный код(1B8h – 1BBh) и таблицу разделов диска. Идентификационный код записывается только операционными системами Windows-NT/2000/XP и может отсутствовать. Помимо MBR, в том же секторе находится таблица разделов диска. Чтобы посмотреть сектор MBR, его надо скопировать в файл, как показано в разделе 9.02-02. Раскрыть не-текстовый файл можно в просмотрщике файлового менеджера Volcov Commander (6.25) или в отладчике DEBUG.EXE (6.05). На рис. 12 показаны фрагменты сектора MBR, скопированного с реального диска.
Рис. 12
Первый фрагмент представляет начальную часть блока исполняемого машинного кода (вариант MBR фирмы OnTrack), второй фрагмент – конечную часть того же блока с текстовым сообщением об ошибке, а третий фрагмент – таблицу разделов, отражающую разбивку на разделы жесткого магнитного диска в конкретном компьютере.
Таблица разделов состоит из четырех дескрипторов разделов, каждый длиной 16 байт. Если считать от начала сектора, то начальные смещения дескрипторов будут 1BEh, 1CEh, 1DEh и 1EEh соответственно. Но так как файл MBR.DAT на рис. 12 загружен со смещения 100h, начальные смещения дескрипторов там будут 2BEh, 2CEh, 2DEh, 2EEh. Последним словом в секторе 01h является сигнатура AA55h, отмечающая конец MBR действующего загрузочного диска.
– 676 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
Четыре дескриптора разделов обеспечивают возможность создания до четырех первичных разделов в каждом физическом дисководе на жестких магнитных дисках. Если фактическое число разделов меньше, то оставшиеся незадействованными дескрипторы заполняются нулями. На рис. 12 видно, что дескриптор первого раздела заполнен нулями и, следовательно, не задействован. Значит, данный жесткий диск разбит на три первичных раздела.
На загрузочном дисководе один из первичных разделов должен быть помечен как загрузочный меткой 80h в первом байте дескриптора. На рис. 12 видно, что метка 80h имеется в первом байте дескриптора второго раздела (в байте со смещением 02CEh). Значит, загрузочным является второй раздел диска.
Сведения о структуре данных, содержащихся в дескрипторах разделов, показаны в приведенной ниже таблице. Значения смещений в первом столбце таблицы отсчитываются от начала каждого дескриптора.
Смещение |
Длина |
Содержание |
00h |
1 |
Статус (= 80h для загрузочного раздела) |
01h |
1 |
Номер стороны (головки) начала раздела |
02h |
1 |
Начальный сектор раздела (примечание 1) |
03h |
1 |
Начальная дорожка раздела (примечание 1) |
04h |
1 |
Идентификатор файловой системы (A.13-6) |
05h |
1 |
Номер стороны (головки) конца раздела |
06h |
1 |
Конечный сектор раздела (примечание 2) |
07h |
1 |
Конечная дорожка раздела (примечание 2) |
08h |
4 |
Число секторов диска перед данным разделом |
0Ch |
4 |
Длина раздела, выраженная числом секторов |
Примечание 1: в байте со смещением 02h номер начального сектора занимает только биты 0 – 5, а биты 6 и 7 представляют старшие разряды 10-битового номера начальной дорожки раздела, младшие 8 бит которого записаны в байт со смещением 03h.
Примечание 2: в байте со смещением 06h номер конечного сектора занимает только биты 0 – 5, а биты 6 и 7 представляют старшие разряды 10-битового номера конечной дорожки раздела, младшие 8 бит которого записаны в байт со смещением 07h.
Примечание 3: если дескриптор относится к разделу, в котором используется адресация LBA (примечание 4 к A.13-6), то данные о номерах головок, секторов и дорожек могут быть недействительны. Но адреса в байтах 08h – 0Fh действительны всегда.
– 677 –

Приложение А.13: Таблицы параметров жестких магнитных дисков
A.13-6 Некоторые идентификаторы файловых систем
Байт со смещением 04h в каждом дескрипторе раздела (A.13-5) содержит идентификатор файловой системы, но основании которого каждая операционная система "решает", сможет ли она обеспечить доступ к данному разделу. Если идентификатор не входит в число "известных" операционной системе, то она не будет предпринимать попыток доступа и, скорее всего, даже не сообщит о наличии такого раздела пользователю. Имеются специальные идентификаторы для обозначения разделов, используемых исключительно в служебных целях и намеренно скрываемых от пользователя. В таблице A.13-6 показано соответствие
между некоторыми распространенными файловыми системами и теми идентификаторами, которые их представляют.
ID |
Значение |
00h |
Незанятое дисковое пространство |
01h |
Файловая система FAT-12 для разделов не свыше 16 Мбайт |
04h |
Устаревшая FAT-16 до 32 Мбайт без кластерной структуры |
05h |
Расширенный раздел с адресацией CHS (примечания 1 и 2) |
06h |
FAT-16 до 2 Гбайт с адресацией CHS (примечание 2) |
07h |
Файловая система NTFS (примечание 3) |
0Bh |
FAT-32 с адресацией CHS (примечание 2) |
0Ch |
FAT-32 с адресацией LBA (примечание 4) |
0Eh |
FAT-16 до 2 Гбайт с адресацией LBA (примечание 4) |
0Fh |
Расширенный раздел с адресацией LBA (примечания 1 и 4) |
11h |
Скрытая FAT-12 для размещения boot-менеджера OS/2 |
14h |
Скрытая FAT-16 для размещения boot-менеджера OS/2 |
1Bh |
Скрытая FAT-32 с адресацией CHS (примечание 2) |
1Ch |
Скрытая FAT-32 с адресацией LBA (примечание 4) |
3Ch |
Служебный раздел программы Partition Magic |
42h |
Динамический раздел операционной системы Windows Vista |
43h |
Менеджер загрузки (BootWizard) PTS-DOS |
4Dh-4Fh |
Разделы операционной системы QNX |
54h |
Служебный раздел DDO программы Disk Manager |
64h-65h |
Разделы операционной системы Novell Netware |
82h |
Раздел подкачки операционной системы Linux |
83h |
Файловая система ext2fs операционной системы Linux |
84h |
Раздел для восстановления состояния электропитания |
85h |
Расширенный раздел системы Linux (примечание 1) |
A0h |
Раздел сохранения состояния портативных компьютеров |
A5h |
Раздел операционной системы FreeBSD |
A6h |
Раздел операционной системы OpenBSD |
A8h |
Раздел UFS операционной системы MacOS |
|
– 678 – |