Системщику

Доступ к дискам на уровне секторов
В DOS есть возможность рассматривать диск как один большой набор данных независимо от типа файловой системы. Это делается с помощью прерываний 2516 и 2616. Вызов описанных ниже функций позволяет практически напрямую обратиться к драйверам дисков, находящихся в ядре ОС.
Необходимо заметить, что с помощью рассматриваемых в этом разделе функций не гарантируется доступ к дискам, сформатирован- ным для других ОС, так как перед доступом драйвер диска должен опознать тип диска. Опознавание производится как аппаратными средствами (попыткой считать определенные сектора и треки диска), так и программными, используя информацию в стартовом секторе диска. Если эта информация отсутствует (на дисках других ОС эта информация естественно отсутствует), то невозможен доступ к данным.
Таким образом, функции прямого доступа к дискам в основном используются для оптимизации доступа, проверки правильности структуры данных на диске и других системных целей.
Структуры данных
typedef struct { /* DOS 4.00 */
dword    dFirstSec; /*номер начального сектора */
word    wNumSec; /*число секторов */
byte    far * pBuffer; /* буфер с данными */
> DISKPACKET, far *LPDISKPACKET;
Параметры:
bDrivO - номер устройства: 0 - A:, 1 - В: и т. д.
wNumSec - число секторов, которое надо прочитать или записать. dFirstSec, wFlrstSec - номер первого обрабатываемого сектора. pBuffer- адрес буфера для обмена с диском. bDriveErr - код ошибки доступа к устройству:
0    - попытка записать на диск, защищенный от записи;
1    - неизвестное устройство в драйвере;
2    - устройство не готово;
3    - неизвестная команда;
4    - ошибка чтения данных;
5    - неправильный размер запроса при обращении к драйверу;
6    - ошибка позиционирования;
7    - неизвестный тип носителя;
8    - сектор не найден;
10    - ошибка при записи;
11    - ошибка при чтении;
12    - другая ошибка. bBiosErr - Код ошибки BIOS:
801б - диск не доступен; обычно не закрыта дверца дисковода;
4016 - ошибка при позиционировании головки дисковода; обычно при существенной порче носителя;
081б - ошибка чтения; локальная порча носителя;
0416 - требуемый сектор не найден; локальная порча носителя;
0316 - попытка записать на диск, защищенный от записи;
0216 - другая ошибка, не перечисленная выше. wOldFlags - содержимое регистра флагов в момент вызова прерывания.
DOS фактически возвращает управление операцией RET, но не
IRET. После вызова необходимо восстановить стек операциями
ADD SP,2 или POPF. pDiskPacket [LPDISKPАСКЕТ, - ] - структура данных, задающая местоположение и число обрабатываемых секторов.

 

Назначение Прерывания 25,6 и 26,6 позволяют считать и записать сектор раздела гинчеетера, доступного DOS, сектор гибкого диска, виртуального диска и любого другого устройства прямого доступа. Необходимо обратить '•••нимание на то, что после возврата ча '.ершине
стека остается слово (wOldFlags) с содержимым регистра флагов до вызова прерывания.
Фактически DOS внутри себя не использует эти прерывания для обращения к устройствам прямого доступа. Прерывания 251б и 261б не позволяют обращаться к винчестеру целиком, в том числе к начальному сектору винчестера, разделам винчестера, сформированным для других ОС.
Как видно из описания, число секторов не может превышать 216, что ограничивает размер раздела DOS на диске 32М, так как стандартно размер сектора равен 512 байт. Переступить барьер 32М можно двумя способами. Первый - увеличить размер буфера DOS. Это делают некоторые специальные драйверы дисков, обеспечивающие в DOS 2.хх и DOS З.хх создание разделов на винчестере объемом более 32М.
Второй - увеличить размер поля, хранящего номер первого сектора. Это сделано в DOS 4.00.
Прямое чтение и запись для устройства прямого доступа объемом более 32М в DOS 4.00
 

Назначение. Использование pDiskPacket позволяет иметь доступ к дискам и разделам размером более 32 Мбайт. Доступ даже к первым секторам больших дисков старым методом, описанным в предыдущем пункте, невозможен: возвращается указание об ошибке.
Доступ к файлу в DOS 4.00
Для совместимости с OS/2 в DOS 4.00 была добавлена очень удобная функция, обеспечивающая открытие и создание файла. Она объединила в себе все основные возможности старых функций открытия и создания файлов, введенные в предыдущих версиях DOS.
Параметры:
psFileName - имя файла. bAccessMode
Access:3 - требуемый способ доступа к данным в файле: 0 - чтение; 1 - запись; 2 - чтение и запись.
Dummy:l
Sharing:3 - указывает, какие операции с файлом могут производить другие процессы: 0 - совместимый режим; 1 - запрещено чтение и запись; 2 - запрещена запись; 3 - запрещено чтение; 4 - нет запретов на доступ к файлу.
Inheritance: 1 - если 0, то индекс файла наследуется из дочернего процесса; 1 - индекс собственный для данного процесса. wAccessMode
bAccessMode:8
Dummy:5
FailErrors:l - если 0, сообщения об ошибках производятся с использованием средств реакции на критические ошибки (INT 2416); 1 - сообщение об ошибке передается в виде кода ошибки вызывающей программе.
WriteThrough:l - если 0, то запись данных на устройство происходит после заполнения внутренних буферов в удобный для системы момент; 1 - запись производится непосредственно до возврата в вызывающую программу. (Только для OS/2.)
DASDOpen:! - если 1, то имя файла указывает на устройство прямого доступа целиком, так что единым файлом будут считаться все данные на устройстве; 0 - требуется доступ к файлу.
(Только для OS/2.) wAttribute - указывает атрибуты файла, к которому требуется доступ:
OOOOh - обычный файл; OOOlh - файл только для чтения; 0002h - скрытый файл; 0004h - системный файл; 0020h - архив. Остальные разряды должны быть равны 0. Можно использовать логическую сумму указанных атрибутов. hFlle, phFile - ключ файла.
dFileSize - необходимый размер файла в байтах.
wOpenFlag - указывает, что надо делать в зависимости от того, существует файл или нет:
Exist:4 - что делать, если файл уже существует: 0 - сообщить об ошибке; 1 - открыть файл; 2 - открыть и установить размер в соответствии с dSize.
NotExist:4 - что делать, если файл не существует: 0 - сообщить об ошибке; 1 - создать файл. wOpenAction, pwOpenAction - указывает, какие действия были
произведены с файлом при его открытии: 1 - файл существовал; 2 - файл был создан, 3 - файл существовал и его размер был изменен в соответствии с dSize.
 

Назначение. ExtOpen объединяет в себе всс необходимые возможности по созданию и открытию файлов. Параметр wAttribute используется только при создании файла. Если Exist в OpenFlag равно 2 и файл существует, то после открытия размер файла становится равным 0. В wAccessMode ноле DASDOpen должно быть равно 0. Более подробное описание wAccessMode см. DosOpen. Если в DOS не была запущена программа SHARE, то поле Sharing игнорируется и считается равным 0.
Возвращаемые значения: hFile, wOpenFlag.
Соответствующая функция в OS/2: DosOpen (psFileName, phFile, pwOpenAction, dFileSize, wAttribute,
wOpenFlag, wAccessMode, dDummy):OsErr    OS / 2
Она имеет только два расширения по сравнению с ExtOpen. Первое - наличие параметра dFileSize, задающего новый размер файла после его открытия или создания. В DOS этот параметр отсутствует и изменить (уменьшить или увеличить) размер файла можно только довольно экзотическим способом - используя FCB и функцию OldBlockRandWrite (2816). Второе различие - добавление флагов DASDOpen и WriteThrough в параметре wAccessMode.
 


Обсудить вопрос в студенческом форуме

 

Сайт содержит информацию о учебном заведении и студенческой общине и не является официальным