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

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

  1. s3dworld

    s3dworld Сергей

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

    Вчера была бессонница и я долго думал о структуре загрузке операционной системы. До сего времени я планировал загружать свою операционную систему с дискеты 3.5' и размером в 1.44 МБ. Собственно выбрал это я только из-за простоты чтения и записи данных. Однако огляделся я вокруг и нигде не могу найти ни дискет, ни дисководов. Получается что всё что я сделаю, я не проверю на реальном железе. Такая перспектива меня не очень устраивает. Поэтому пришлось мне внимание обратить на два других способа (хотя, видимо, ещё бывает загрузка загрузочного сектора по сети): CD-ROM/DVD-ROM и USB.

    Чем будут отличаться в программировании CD-ROM и DVD-ROM я не знаю. Ну и собственно для моих возможностей про DVD-ROM можно забыть (хотя я имею в виду не про приводы, а про размещение операционной системы на DVD-R носителе). С ним хоть дело обстоит чуть проще. Можно на создавать для эмулятора iso-образов, а когда нужно на реальном железе проверить, то раскошелиться и записать на CD-R. Но и тут придётся изучать уже какую файловую систему ISOxxx (xxx - это не помню что там дальше). Хотя, если иметь прямой доступ к CD-ROM может быть можно записать любые комбинации байтов, чтобы записать свою файловую систему?

    Теперь что касается USB. Сам по себе это был бы для меня самый идеальный вариант. Можно перезаписывать сколько угодно, можно записать хоть свою файловую систему. Всё удобно, кроме одного - я понятия не имею как USB программировать. Я думаю это таким объёмным, что по сравнению с этим, написание операционной системы для меня покажется задачей по алгебре за 9 класс. Это возможно BIOS имеет функции для чтения и записи данных с USB носителя, но в защищённом режиме я буду беспомощен. Ведь USB - это не просто взял и начал программировать. Там есть какой-то корень, нужно его изучить. Потому что в USB можно тыкать всё что не лень. То есть изучить этот протокол, а потом на этом протоколе обменивать данными с устройством накопления информации USB-Flash. Но честно, там ведь запутаешься. Вот лично на моём компьютере спереди два USB-разъёма, и четыре сзади. Как-то нужно распределять, ведь этот корень USB один на них всех (вроде бы).

    Ну и ещё, наверняка эти оба способа уже не работают в режиме CMS (цилиндр-головка-сектор, или как там его). Хотя может и работает в режиме поддержки, но является не основным. Так каким является основной способ считывание.записи информации для тих двух приводов: CD-ROM и USB (хотя USB я бы приводом не назвал).

    Вот и думаю какой из вариантов выбрать. Кстати, и как теперь осуществляется чтение и запись данных на магнитных дисках? Слышал там линейная адресация. Это как? Ведь одного регистра не хватит чтобы охватить диапазон, скажем в 300 ГБ.

    Про жёсткий диск я спросил пока для познавательных целей. Вначале я не буду его использовать (не буду копировать файлы и создавать загрузочную область на нём). Первым что я хотел, это создать всё на дискете и иметь возможность на ней же фиксировать изменения, то есть сохранять. Если дело будет касаться CD-ROM'а, то будет возможность только чтения данных. А если USB, то и чтение и запись.

    Помогите определиться в выборе носителя операционной системы и немного расскажите о принципах программирования глазами тех, кто уже это освоил. Так мне потом будет легче читать материал уже по программированию этих устройств.
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Запускай свою ось на виртуальной машине, а не на реальном железе через дискету.
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Решил использовать CD-ROM для загрузки образа операционной системы и файлов. Но так же и хочу использовать HDD. Не очень хочется вникать в чужую файловую систему, поэтому думаю создать свою. Но смущает меня вот что.

    Существует IDE (ATA, PATA) и SATA. Например у меня на компьютере DVD-ROM подключен к IDE, а HDD - к SATA. Конечно обращение к секторам будет осуществляться по LBA, но всё же ведь это разные интерфейсы. Да и разрядность для обращения к секторам бывает разная: 28-битная, 32-битная и 48-битная.

    Меня интересует разница программирования в защищённом режиме устройств HDD и CD-ROM/DVD-ROM в интерфейсах IDE и SATA. Что нужно конкретно про это знать? Есть ли золотая серединка или для каждого интерфейса свой подход? Как определять какие на компьютере есть интерфейсы (IDE, SATA) и подключены ли к ним устройства и какие если подключены?

    Ещё интересует способ получения и записи данных на эти устройства. Как это осуществляется? Да я через регистры будут читать статусы и посылать команды. Вроде бы есть регистр данных. Но как вытягиваются данные? Нужно мне считать сектор (512 байт), и откуда эти 512 байт мне попадут в память (не через 1-2 байтный регистр же?!)?

    Вроде бы есть какой-то DMA, но как я понимаю, он нужен только если есть многозадачность. Так? Можно про это всё по подробнее и про DMA. Вроде бы DMA - это передача данными без процессора. Стоит ли её всегда использовать?
     
  4. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Если использовать DMA, то диск зам запишет/считает данные.
    Иначе через двухбайтный порт. Что-то вроде:
    Код (Text):
    1. mov di, buffer
    2. mov cx, 256
    3. mov dx, номер порта
    4. rep insw
    или:
    Код (Text):
    1. mov si, buffer
    2. mov cx, 256
    3. mov dx, номер порта
    4. rep outsw
    И это абсолютно нормальный способ. Однако в многозадачной ОС предпочтительней будет использовать DMA.
     
  5. s3dworld

    s3dworld Сергей

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

    А считывать по 2 байта, это разве не долго?

    Код (Text):
    1. rep insw
    2. rep outsw
    Это что за инструкции?
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    KIV
    Если не считать что он (PIO) в несколько раз медленнее DMA и то что процессор будет вынужден ждать пока данные не поступят. Единственный нормальный способ это DMA.
    PIO нужен только для совместимости. А еще для наглядности того что так делать не стоит.
     
  7. Babyshamble

    Babyshamble New Member

    Публикаций:
    0
    Регистрация:
    2 май 2010
    Сообщения:
    67
    PIO в однозадачной среде будет как раз быстрее, DMA это чтобы не нагружать процессор если ему есть чем заняться
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Честно тебе скажу, это плохая мысль и скорее всего ты бросишь эту затею. Потому что сразу придумать пусть даже удобную для работы с ней и для хранения ей данных будет почти нереально, а потом переписывать существующий код будет уже ой как поздно.
    Лучше начать реализовывать у себя достаточно простые файловые системы, чтобы понять сперва что и к чему. FAT12 (Windows и DOS на дискетки пишут в которой) подойдет как никто другой. Потом дополнить драйвер, чтобы хендлил FAT16, потом и FAT32. Потом можно будет создать тестовыйраздел на харде и попробовать прочитать.
    И на это все уйдет немного времени. А вот пока заработает самопальная ФС и без ошибок и без "странных" "пропаданий кластеров" или что там еще может случиться...
    Если есть большое желание разработать именно свою ФС, лучше это сделать отдельно, написать код для работы с ней в какой-то другой ОС, и уже когда там отладишь, тащить к себе. Короче, настойчиво пытаюсь отговорить от этого)
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Как раз не будет.
     
  10. s3dworld

    s3dworld Сергей

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

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

    Поэтому меня интересует, как через BIOS грузить в режиме LBA.

    Можно ли это и если можно, то как?

    Лично я сразу открыл описание всех функций прерывания 0x10. Ничего не нашёл такого, что бы упоминало об LBA (хотя возможно у меня очень древнее описание). Нашёл только какую-то:

    Что это и для чего?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Тебе нужы по ходу BIOS Enhanced Disk Drive Services (int 13, ah = 4x-5x) и FDPT. Гугл в помощь с поиском спецификаций


    ps. я это нагуглил за минуту, неужели было так сложно найти нормальное описание? я что-то не пойму, почему народ так яростно не умеет юзать поиск
     
  12. SII

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

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

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    С тут решил разобраться с файловой системой CD-диска. А их оказывается несколько. Я нашёл: ISO 9660, HFS и Universal Disk Format. Вот и не знаю какой использовать.

    Можете кратко рассказать о плюсах и минусах каждого из них, и какой используете именно Вы и почему.
     
  14. s3dworld

    s3dworld Сергей

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

    [​IMG]

    И ничего тут не понял. Что за размер CD-DA и что за размер без CD-DA. И сколько же байт в одном секторе? У меня ничего не сходится.
     
  15. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Опа, блин! Это что получается, что за один вызов функции 0x02 прерывания 0x10 с одни сектором, мне вернётся 2048 байт?
     
  16. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Так эта табличка ошибочная или я на самом деле за один раз могу получить минимум 2048 байт? Сколько байт минимум можно получить?
     
  17. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Объясните, пожалуйста функцию 0x42 прерывания BIOS 0x13 - Extended Read. Вот её формат:

    Как я понимаю, она используется для чтения секторов в режиме LBA с жёстких дисков и компакт-дисков (CD/DVD). Следовательно в регистр DL нужно указывать значение не меньше 0x80. Так?

    А вот указатель DS:SI, будет указывать на область в оперативной памяти где содержится линейный адрес сектора на устройстве или куда должны будут скопированы секторы с устройства? Не понятно следующее:

    - если DS:SI указывает на память, где содержится информация об линейном адресе сектора, тогда где указывается информация об участке памяти, куда нужно скопировать сектора (и наоборот);

    - где указывается количество считываемых секторов.

    Я вижу только один выход - DS:SI указывают на область памяти, где описано всё что мне нужно. Надеюсь я прав.

    Пока писал это, переключался между страничками и кое что нашёл. Действительно, DS:SI указывает на область памяти, где должна располагаться структура:

    [​IMG]

    Тут мне всё понятно, кроме одного: transferBuffer занимает 4 байта. То есть это 32-битный адрес. Но я ведь нахожусь в режиме реальных адресов, тут сегментные регистры рулят. И если мне нужно чтобы сектор был записан по адресу 0x0000:0x7E00, что мне нужно в этом поле указать?

    Ещё один важный вопрос, который касается именно CD-ROM. Где я не искал, получается что на CD в одном секторе 2048 байт. Так если я использую функцию 0x42 прерывания BIOS 0x13 для CD-ROM, именно укажу, что мне нужен один сектор. Тогда сколько байт мне придёт?

    Представим что действительно будет приходить по 2048 байт на сектор. Тогда как же получается, что на диске в 650 МБ находится 333000 секторов, и занимают они 681984000 байт. Тут всё сходится, но никак не вписывается загрузочный сектор в 512 байт. Он что, не в учёт или я что-то не понимаю?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    О боже..... 16 бит сегмент, 16 смещение. Сколько вместе?
     
  19. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Great
    Класс. Это что, функция мне какой-то из сегментных регистров загадит?

    Ну а как быть с размером сектора? Как тут дело обстоит, сколько байт возвращается?
     
  20. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    На CD 1 сектор - 2 КБ.
    На всех прочих носителях (HDD, Floppy, Flash) он 512 байт.