Когда происходит чтение или запись на диск, куда идут данные?

2792
Kaitlyn Mcmordie

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

Кто-нибудь также знает, как называется буфер? И как DMA вписывается во все это?

7

2 ответа на вопрос

16
sawdust

Для чтения с диска поток данных по существу:

  • после того, как сборка для чтения / записи будет в запрошенном цилиндре, будет выбрана запрошенная головка.
  • в каждом секторе читается идентификатор сектора. Если считанный номер сектора совпадает с запрошенным номером сектора, то данные сектора считываются.
  • данные сектора считываются как последовательный битовый поток и преобразуются в байты.
  • байты сектора хранятся в буфере сектора (обычно SRAM в контроллере); этот секторный буфер отличается от «дискового кэша».
  • После считывания всего сектора данные проверяются с использованием ECC и, возможно, корректируются.
  • После проверки данные сектора передаются с контроллера на хост-компьютер. Примечание: существование этого секторального буфера не очень хорошо известно, и существует широко распространенная дезинформация о том, что скорость передачи на интерфейсе хоста (egATA) связана или ограничена скоростью передачи в головке R / W. Это совершенно неверно, поскольку эти две передачи данных являются независимыми и последовательными операциями, а не одновременными.
  • так как ПК получает данные от контроллера диска через интерфейс ATA, ПК может использовать либо запрограммированный ввод-вывод (ЦП многократно считывает регистр данных порта ATA и копирует значение в память назначения), либо DMA (контроллер DMA установка для копирования N байтов из регистра данных порта ATA в буфер памяти без дальнейшего вмешательства ЦП).
  • «Буфер» памяти компьютера, который принимает данные, может быть буфером приложения (при использовании системного вызова блочного ввода-вывода ), или может быть внутренним системным буфером под управлением файловой системы, или даже памятью программы или данных, если данные поступают из свопинга область (или файл подкачки).

Запись на диск аналогична, за исключением того, что данные передаются с ПК на контроллер диска, вычисляется ECC, запрашивается сектор, а затем данные записываются из буфера секторов на диск.

Для дополнительного кредита:

Читайте о передачах " рассеяния-сбора ", которые используют цепочку DMA и список рассеяния-сбора адресов памяти и длины буфера. Вместо одного большого непрерывного буфера памяти передача "разброс-сборка" позволяет агрегировать несмежные буферы памяти для запроса дискового ввода-вывода.

Возможно, можно сказать немного менее конкретно о «ч / б головках», поскольку немеханические приводы в наши дни используются гораздо чаще, но это хороший ответ. Shinrai 12 лет назад 1
@Shinrai - у меня есть только опыт из первых рук программирования с дисководами с подвижным рычагом (и я использовал приводы с фиксированной головкой). Я предпочитаю не спекулировать или повторять информацию о том, как работают твердотельные накопители. sawdust 12 лет назад 0
+1 за этот отличный ответ, хорошо документированный и написанный. Очень профессиональный. climenole 11 лет назад 0
2
Aaron D. Marasco

Он входит в определенную область памяти, в которой ядро ​​выделило драйвер диска. Я не думаю, что это конкретно названо. Эта область памяти обычно настраивается как кольцевой буфер . В зависимости от ОС эта память может быть скопирована во второй раз в пользовательское пространство для использования приложением.

DMA - это «прямой доступ к памяти», что означает, что контроллер дисковода может напрямую записывать в ОЗУ, не заставляя ЦП многократно запрашивать его, есть ли дополнительные данные (известный как опрос - как обычно это делалось). Вместо этого, когда весь буфер был передан, контроллер прерывает процессор, чтобы сообщить ему, что данные теперь доступны.

Если вас интересует еще более низкий уровень, драйвер выполняет вызовы ioctl .

Кольцевые буферы обычно используются сетевыми устройствами (например, контроллером Ethernet), потому что данные могут поступать незапрошенными (неожиданно без ожидающего запроса на чтение). Данные с дисковода / контроллера всегда в ответ на запрос, сделанный хостом. Данные запрашиваются, поэтому нет необходимости в «кольцевом буфере» в драйвере диска. sawdust 12 лет назад 1
Хорошо, я работал только с ЦАПами на уровне драйверов, и они тоже используют кольцевые буферы, поэтому я предположил. Aaron D. Marasco 12 лет назад 0