Программирование дисковой подсистемы

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 27 дек 2010.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    С какой радости он 512 байт?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    С чего ты взял? Ты в курсе про адресацию в реальном режиме?
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV и Great
    Это что, если у меня вставлен CD-диск в привод и с него был загружен загрузочный сектор, то у меня будет занята не от 0x7C00 до 0x7DFF, а от 0x7C00 до 0x83FF? А как же признак сигнатуры? Всё на том же 0x01FE и 0x01FF?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нет, загрузка с сд не так проходит, насколько я помню. По крайней мере в начале образа СД точно нет загрузочного кода - никогда его там не видел.
    Там есть режим эмуляции флоппи, эмуляции харда и без эмуляции. Можно выбрать и число загружаемых секторов (при эмуляции с флоппи будут эмулироваться флоппи сектора по 512 байт).
    Короче, гугли спецификацию
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Ну судя по этому рисунку:

    [​IMG]

    Я понял что всё начинается со смещения 0x8000 и что для меня будет лучше CD-ROM (mode 2). Только никакой сигнатуры 0x55AA я не нашёл.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Слушай, ну возьми ты Nero, запиши несколько образов загрузочных СД со всеми типами эмуляции и посмотри хексредактором, неужели так сложно)
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Great
    А это тоже религия не позволяет :)
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    В общем понятно...

    Я тут подумал, а зачем мне CD-диск?! Разве у меня будет такая огромная система?! Думаю что "Нет"! Поэтому решил всё таки вернуться к дискетам. И решил серьёзно за них взяться. В связи с этим хочу задать несколько вопросов:

    1. Можно ли через BIOS грузить дискеты в режиме LBA (ну чтобы он сам преобразовывал цилиндры-головки-сектора в линейный адрес сектора)? Думаю что нельзя, но мало ли.

    2. Так как дискеты бывают с разным количеством головок (1 или 2), с разным количеством цилиндров на головке и с разным количеством секторов в цилиндре, то получается полная не разбериха. Я даже не понимаю как тогда правильно эмуляторы работают, когда я им подсовываю не дискету, а образ дискеты, где нет ничего, чтобы указывало на количество головок, цилиндров и секторов. Как же тогда всё это работает?

    3. Возможно стоит написать программу под Windows (31 числа мне принесут floppy-дисковод и пару дискет), которая бы определяла сколько головок на дискете, сколько цилиндров на каждой головке и сколько секторов на каждом цилиндре каждой головки. Форматировала бы дискету в мою файловую систему и в специальные поля вносила бы информацию о количестве головок, количестве цилиндров на головках и секторов на головке. Может так стоит делать?

    4. Если первый сектор дискеты (головка 0, цилиндр 0, сектор 1) повреждён, то такая дискета считается уже не пригодной как загрузочной или же загрузчик будет в этом случае грузить следующий сектор и так до тех пор пока не найдёт без ошибок?

    5. Если действительно переменной количестве секторов на цилиндре и цилиндров на головке, так же как и количество головок, то тогда не возможно же будет перевести всё это в LBA, который бы значит номер сектора последовательно от начала до конца?

    Я просто сейчас описываю файловую систему свою, которая сохраняет абсолютный номер сектора. Может быть это я зря, раз тут от дискеты к дискете переменчивое количество головок, цилиндров и секторов? Может мне нужно это дело сохранять в виде головка-цилиндр-сектор?
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Интересный вопрос, если это не так, то просто беда((
    Но думаю что не до конца а в разумных пределах
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    То есть всё-таки если первый сектор повреждён, BIOS будет считывать следующий сектор?
     
  11. wild_cosine

    wild_cosine New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2010
    Сообщения:
    11
    да, и получишь битые данные из-за малейших царапиин.

    стандартный Data CD использует mode 1 и имеет 2048 байт эффективных данных на сектор
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Загрузка с дискеты возможна только из первого сектора; если он повреждён, дискета отправляется в мусорку (поскольку в том же секторе находится информация, необходимая для определения типа файловой системы и т.д.).

    LBA применяется с чем угодно, но только не с дискетами, там только CHS.
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

    Только что закончил писать спецификацию о своей файловой системе BFSM. Хочу чтобы Вы её оценили и оставили тут свои комментарии.

    Ссылка на описание файловой системы: http://dubrovkin.h18.ru/BFSM.htm
     
  14. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    зачем столько свободных байт (500) на дискете и так места мало.
    и потом мне кажется что fat намного меньше и проше по размеру. и еще вместо двух fat можно сделать одну(для экономии).
     
  15. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    abcd008
    Ну я подумал что указывать индекс сектора и смещение в сектор будет слегка запутанным. Поэтому описатель системы начинается с нового сектора.
     
  16. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Бредни аля "монолог". Пешы свой кодэс уже да вылаживай. А "спецификация своей ФС" наверное у всех была, только вот после первого же знакомства с фат желание её реализовывать отпадает. На неё ведь файлы заливать потом. И чего для какой-то самописной оси юзверь лишний раз трахаццо с левыми тлузами будет? Да и самому это быстро надоест. Так что не ленись, достань Кулакова и делай всё с фат.

    З.Ы. хотя я уверен, что желание писать свою ось отвалится на этапе написания для неё более менее универсальных драйверов
     
  17. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброй ночи!

    Бегло сейчас пробежался по статье http://www.avprog.narod.ru/progs/fat.html#02h. Появилось несколько вопросов.

    Получается что в файловой системе FAT12 каждая папка - это новый кластер. Так? Почему тогда на целые 512 байт всего две записи вносится в папку? И зачем для папки выделяется ещё второй кластер?

    Если честно, мне всё равно как там это устроено. Я стал разбирать эту файловую систему из-за того, что хочу понять как в моей файловой системе лучше сделать указание того, к какой папке принадлежит папка/файл.

    То есть если мне каждую папку описывать как отдельный сектор, то всё просто. Для подчинённого файла/папки мне достаточно только указывать номер сектора где лежит описание родительской папки. Но в этом случае получается не удобство в выводе информации обо всех папках/файлах данного каталога, так как описание интересующей папки находится в одном месте, а описание её подчинённых файлов/папок - в другом.

    Если же делать так, чтобы в описании папки указывался список всех её папок/файлов в виде характеристик этих объектов, а в каждой характеристике чтобы указывался сектор, где будут лежать уже либо части данных для файла, или список прикреплённых папок/файлов для папки, тогда нужно в качестве где располагается их родительская папка, указывать не только номер сектора где их папка описана в списке другой папки, но и индекс папки в списке.

    В общем никак не могу определить как сделать так, чтобы по папке/файлу можно было обратно шагать. Думал сделать вообще без того чтобы можно было в обратном направлении идти, но задумался, не просто же так оно нужно, раз в FAT12 сделано.
     
  18. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Нашёл в Win32 API функцию DeviceIoControl(). С помощью неё можно узнать информацию о поверхности (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX) и многое другое. В связи с этим у меня несколько вопросов.

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

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

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

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

    s3dworld Сергей

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

    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2.  
    3. #include <Windows.h>
    4. #include <iostream>
    5. #include <string>
    6. #include <sstream>
    7. #include <WinIoCtl.h>
    8.  
    9. HANDLE file=0;
    10.  
    11. void Release(void);
    12.  
    13. int main(const int _paramsCount,const char** _param)
    14. {
    15.     DISK_GEOMETRY diskGeometry;
    16.     unsigned long int bytesReturn=0;
    17.     std::string string;
    18.     std::stringstream stream(std::ios::out | std::ios::in);
    19.  
    20.     memset(&diskGeometry,0,sizeof(DISK_GEOMETRY));
    21.  
    22.     std::cout<<std::endl<<"Welcome DInfo!"<<std::endl<<std::endl;
    23.  
    24.     std::cout<<"Connect in device A..."<<std::endl;
    25.     file=CreateFile("\\\\.\\A:",GENERIC_READ,0,0,OPEN_EXISTING,0,0);
    26.  
    27.     if(file==INVALID_HANDLE_VALUE)
    28.     {
    29.         if(GetLastError()==ERROR_FILE_NOT_FOUND)
    30.             std::cout<<"Device A not find!"<<std::endl;
    31.         else
    32.             std::cout<<"Unknown error device A!"<<std::endl;
    33.  
    34.         Release();
    35.         return -1;
    36.     }
    37.  
    38.     std::cout<<"Successfully connect in device A."<<std::endl<<std::endl;
    39.     std::cout<<"Getting info diskette..."<<std::endl;
    40.  
    41.     if(!DeviceIoControl(
    42.         file,
    43.         IOCTL_DISK_GET_DRIVE_GEOMETRY,
    44.         0,
    45.         0,
    46.         &diskGeometry,
    47.         sizeof(DISK_GEOMETRY),
    48.         &bytesReturn,
    49.         0))
    50.     {
    51.         std::cout<<"Error getting info diskette!"<<std::endl;
    52.         Release();
    53.         return -1;
    54.     }
    55.  
    56.     std::cout<<"Successfully getting info diskette."<<std::endl<<std::endl;
    57.  
    58.     string.clear();
    59.     stream.clear();
    60.     stream<<diskGeometry.Cylinders.QuadPart;
    61.     stream>>string;
    62.     std::cout<<"Cylinders: "<<string<<std::endl;
    63.  
    64.     string.clear();
    65.     stream.clear();
    66.     stream<<diskGeometry.TracksPerCylinder;
    67.     stream>>string;
    68.     std::cout<<"Tracks in cylinder: "<<string<<std::endl;
    69.  
    70.     string.clear();
    71.     stream.clear();
    72.     stream<<diskGeometry.SectorsPerTrack;
    73.     stream>>string;
    74.     std::cout<<"Sectors in track: "<<string<<std::endl;
    75.  
    76.     string.clear();
    77.     stream.clear();
    78.     stream<<diskGeometry.BytesPerSector;
    79.     stream>>string;
    80.     std::cout<<"Bytes in sector: "<<string<<std::endl;
    81.  
    82.     string.clear();
    83.     stream.clear();
    84.     stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack);
    85.     stream>>string;
    86.     std::cout<<std::endl<<"All sectors: "<<string<<std::endl;
    87.  
    88.     string.clear();
    89.     stream.clear();
    90.     stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack*diskGeometry.BytesPerSector);
    91.     stream>>string;
    92.     std::cout<<"All size: "<<string<<std::endl;
    93.  
    94.     Release();
    95.     return 0;
    96. }
    97.  
    98. void Release(void)
    99. {
    100.     if(file)
    101.     {
    102.         CloseHandle(file);
    103.         file=0;
    104.     }
    105.  
    106.     std::cout<<std::endl<<"Goodby!"<<std::endl<<std::endl;
    107. }
    Как видно, тут нет понятия головки. А вот в BIOS функции используется понятие головка. Значит ли это, что дорожку можно обозвать головкой?

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

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

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

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго вечера!

    Сегодня закончил придумывать DFS-FD. Это моя последняя файловая система на текущий момент времени. Реализовал практически всё что хотел. Собственно не реализовал такую часть данных, как восстановление информации. Собственно я под этим понятием понимаю фиксирование действий с файловой системой, чтобы в случае зависания компьютера, отключения электричества или ещё какие-то сбои, чтобы в случае этого не нарушить структуру и целостность файловой системы, чтобы обойтись без потери данных.

    Как такие вещи вообще делаются? А то фиксировать то что я делаю - это туда-сюда головку носить, будет очень медленно. Уж не думаю что в файловых системах забывают делать какие-то меры предосторожности против отключения питания. Расскажите, как такие вещи делаются.