OSDev

для всех
Текущее время: 15 май 2024, 05:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 9  След.
Автор Сообщение
СообщениеДобавлено: 02 янв 2011, 19:12 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Я не понял, что ты написал. Могу сказать только одно, в fat все реализовано вполне логично. Вместо того, чтобы что-то предполагать, скачай и почитай описание.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 янв 2011, 19:27 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Я имею в виду то, что в FAT реализовано описание списка объектов в папке так:

Цитата:
<Папка>
<Название папки>
<Атрибуты папки>
// Список объектов, которые принадлежат папке (точнее ссылки на их описание)
<Ссылка на Папку 1>
<Ссылка на Папку 2>
<Ссылка на Файл 1>
<Ссылка на Файл 2>
<Ссылка на Файл 3>


И если перейдём на ссылку Папки 1, то там будет:

Цитата:
<Папка 1>
<Название папки>
<Атрибуты папки>
// Список объектов, которые принадлежат папке (точнее ссылки на их описание)
<Ссылка на Папку 1.1>
<Ссылка на Папку 1.2>
<Ссылка на Файл 1.1>
<Ссылка на Файл 1.2>
<Ссылка на Файл 1.3>


И так далее...

Или же там делается так:

Цитата:
<Папка>
<Название папки>
<Атрибуты папки>
// Список объектов, которые принадлежат папке (точнее ссылки на их описание)
<Описание Папки 1>
<Описание Папки 2>
<Описание Файла 1>
<Описание Файла 2>
<Описание Файла 3>


Как там? Просто если используется первый вариант, тогда прежде чем вывести названия объектов, нужно пройтись по всем ссылкам, а это потребует времени. А если названия и атрибуты объектов хранить в списке, тогда будет мгновенно.

Так как в FAT реализовано?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 янв 2011, 20:30 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Ты выложил ссылку на страницу, где дано более-менее нормальное описание. Если не брать в расчет длинные имена, то каталог содержит только 32-байтовые записи, каждая из которых описывает файл или подкаталог (возможно, удаленные). Первые две записи всех каталогов кроме корневого имеют спец. назначение. Одна содержит ссылку на первый кластер данного каталога, вторая - на первый кластер родительского. Фактически эти записи дублируют записи о текущем и родительском каталогах в других каталогах, только в поле Имя содержат соответственно "." и ".." вместо реальных имен каталогов. Лично я использую запись "." только для проверки корректности каталога (по сути она избыточна), а в качестве имени или части имени объекта ФС считаю эту запись некорректной за исключением ситуации, когда "." является самодостаточным именем вполне конкретного объекта. В других ОС эти записи могут использоваться наравне с остальными, хотя по сути обозначают каталоги, не вложенные в текущий.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 янв 2011, 19:13 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Нашёл в Win32 API функцию DeviceIoControl(). С помощью неё можно узнать информацию о поверхности (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX) и многое другое. В связи с этим у меня несколько вопросов.

1. IOCTL_DISK_GET_DRIVE_GEOMETRY_EX это только для всех устройств, которые поддерживают режим цилиндр-головка-сектор?

2. Раз Win32 API позволяет узнать параметры цилиндр-головка-сектор, значит они хранятся на самом устройстве? Как их получить через порты?

Ещё интересно вот что:

3. Как можно узнать через Win32 API количество секторов на USB-флешка? Да и это полезно для всего, что не хочется использовать через цилиндр-головка-сектор.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 янв 2011, 22:13 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
1. Нет.

2. Это зависит от используемого интерфейса. В ATA есть команда, возвращающая т.н. паспорт диска.

3. Та же функция, которую ты упомянул.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 янв 2011, 23:08 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Нашёл тут функцию для определения вставлена ли дискета в дисковод:

Цитата:
48)----------------------------------------------------------------------------

Q> Как проверить, есть ли дискета в дисководе?

A>

Код:
BOOL IsDiskInDrive ( LPTSTR lpszDrive )
{
   UINT     errmode;
   TCHAR    szVolName[256];
   DWORD    dwMaxComSize;
   DWORD    dwFlags;
   TCHAR    szFS[256];
   BOOL     bRes;

   errmode = SetErrorMode ( SEM_FAILCRITICALERRORS );
//если не сделать SetErrorMode - выскочит стандартное окошко "Drive Not Ready"

   bRes = GetVolumeInformation ( lpszDrive,
                                 szVolName,
                                 sizeof(szVolName),
                                 NULL, &dwMaxComSize,
                                 &dwFlags,
                                 szFS, sizeof(szFS) );
   SetErrorMode ( errmode );
   return bRes;
}


Эта технология также работает с CDROM и другими сменными устройствами.


Вкрадывается у меня сомнение, а не будет ли она правильно работать только если на носителе та файловая система, которую Windows знает? А то вот отформатирую дискету в свою файловую систему, а он мне покажет что дискета не вставлена.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 янв 2011, 23:49 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Так и будет. Тебя вообще куда-то не туда понесло. Каковы твои цели?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 янв 2011, 00:11 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Придумал новую свою файловую систему. Постарался учесть все нюансы, которые не затрагивали бы многопроцессорность и многоядерность. Спецификацию пока не оформил, поэтому показать не могу (всё что придумал, пока только в тетраде).

Так вот, мои цели...

Написать программу для операционной системы Windows, которая бы умела работать с моей файловой системой. А именно:

1. Создавала образ дискеты с моей файловой системой.
2. Работала бы с этим образом: открывала, сохраняла, читала, добавляла, изменяла файлы.
3. Форматировала бы дискету в мою файловую систему.
4. Работала бы с дискетой: открывала, сохраняла, читала, добавляла, изменяла файлы.
5. Создавала бы виртуальный образ с дискеты.
6. Записывала бы образ дискеты на дискету, с учётом ошибочных секторов на дискете.

В общем файловый менеджер для работы с моей файловой системой и в образе и с дискетой на прямую. А следовательно мне нужно получать полную информацию о том какие приводы для гибких дисков есть в системе, имеется ли дискета в приводе, сколько всего секторов на дискете, сколько секторов на дорожке, сколько дорожек на цилиндре, сколько цилиндров на головке и сколько головок. Узнавать какие сектора повреждены. Узнавать включена ли защита от записи на дискету (отмычка передвинута) или же сектор с ошибкой. В общем мне нужна вся информация, которая позволила бы вести правильную работы с дискетой.

А что касается тоже самого, но уже при разработке своей собственной операционной системы, то там видимо что-то можно получить через функции BIOS, а что-то через регистры устройства.

В общем такая вот у меня скромная задача.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 янв 2011, 08:32 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
В 6 пункте достаточно ограничиться сообщением об ошибке при записи. Если копия на дискете будет отличаться от оригинала из-за наличия сбойных секторов, то это может пользователя сбить с толку.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 янв 2011, 17:56 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Я тут программу написал (скачать можно тут: http://www.gamedev.ru/files/?id=62606), которая выдаёт информацию о дискете. Вот код на языке C++:

Код:
#define WIN32_LEAN_AND_MEAN

#include <Windows.h>
#include <iostream>
#include <string>
#include <sstream>
#include <WinIoCtl.h>

HANDLE file=0;

void Release(void);

int main(const int _paramsCount,const char** _param)
{
   DISK_GEOMETRY diskGeometry;
   unsigned long int bytesReturn=0;
   std::string string;
   std::stringstream stream(std::ios::out | std::ios::in);

   memset(&diskGeometry,0,sizeof(DISK_GEOMETRY));

   std::cout<<std::endl<<"Welcome DInfo!"<<std::endl<<std::endl;

   std::cout<<"Connect in device A..."<<std::endl;
   file=CreateFile("\\\\.\\A:",GENERIC_READ,0,0,OPEN_EXISTING,0,0);

   if(file==INVALID_HANDLE_VALUE)
   {
      if(GetLastError()==ERROR_FILE_NOT_FOUND)
         std::cout<<"Device A not find!"<<std::endl;
      else
         std::cout<<"Unknown error device A!"<<std::endl;

      Release();
      return -1;
   }

   std::cout<<"Successfully connect in device A."<<std::endl<<std::endl;
   std::cout<<"Getting info diskette..."<<std::endl;

   if(!DeviceIoControl(
      file,
      IOCTL_DISK_GET_DRIVE_GEOMETRY,
      0,
      0,
      &diskGeometry,
      sizeof(DISK_GEOMETRY),
      &bytesReturn,
      0))
   {
      std::cout<<"Error getting info diskette!"<<std::endl;
      Release();
      return -1;
   }

   std::cout<<"Successfully getting info diskette."<<std::endl<<std::endl;

   string.clear();
   stream.clear();
   stream<<diskGeometry.Cylinders.QuadPart;
   stream>>string;
   std::cout<<"Cylinders: "<<string<<std::endl;

   string.clear();
   stream.clear();
   stream<<diskGeometry.TracksPerCylinder;
   stream>>string;
   std::cout<<"Tracks in cylinder: "<<string<<std::endl;

   string.clear();
   stream.clear();
   stream<<diskGeometry.SectorsPerTrack;
   stream>>string;
   std::cout<<"Sectors in track: "<<string<<std::endl;

   string.clear();
   stream.clear();
   stream<<diskGeometry.BytesPerSector;
   stream>>string;
   std::cout<<"Bytes in sector: "<<string<<std::endl;

   string.clear();
   stream.clear();
   stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack);
   stream>>string;
   std::cout<<std::endl<<"All sectors: "<<string<<std::endl;

   string.clear();
   stream.clear();
   stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack*diskGeometry.BytesPerSector);
   stream>>string;
   std::cout<<"All size: "<<string<<std::endl;

   Release();
   return 0;
}

void Release(void)
{
   if(file)
   {
      CloseHandle(file);
      file=0;
   }

   std::cout<<std::endl<<"Goodby!"<<std::endl<<std::endl;
}


Как видно, тут нет понятия головки. А вот в BIOS функции используется понятие головка. Значит ли это, что дорожку можно обозвать головкой?

В общем подскажите, как мне из абсолютного адреса сектора (в моём случае пускай адрес первого сектора начинается с нуля) получить параметры для функции BIOS: головка, цилиндр и сектор.

И ещё, стоит ли в загрузочном секторе хранить полученную информацию о количестве цилиндров, дорожек на цилиндре, количестве секторов на дорожке и размер сектора в байтах?

Удивительно, раньше я думал что есть головки, на которых находятся цилиндры. На цилиндрах находятся дорожки, но на дискете 3.5' HD на каждом цилиндре всего одна дорожка, поэтому их опускают. А на каждом цилиндре находится сектора. А тут картина складывается такая, что нет головок, есть цилиндры. Каждый цилиндр состоит из двух дорожек (как-бы двух головок) и каждая дорожка состоит из 18 секторов. Раньше думал что главным считается головка, затем цилиндр и сектор. А теперь оказывается цилиндр-дорожка-сектор.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB