Блочное устройство - Инициализировать структуру Gendisk, если она не кратна 512 байтам. - PullRequest
0 голосов
/ 17 мая 2018

В настоящее время я изучаю программирование драйверов ядра, используя Драйверы устройств Linux - 3-й .

Чтобы определить блочное устройство, я должен объявить структуру gendisk и инициализировать ее соответствующей информацией.

В главе 16 написано:

сектор_т емкость;

Емкость этого накопителя в 512-байтовых секторах. Тип sector_t может иметь ширину 64 бита. Драйверы не должны устанавливать это поле напрямую; вместо этого передайте число секторов в set_capacity.

Обычно я устанавливаю емкость, используя вызов как:

set_capacity(gendisk, sector_number*(hard_sector_size/KERNEL_SECTOR_SIZE));

Представьте, что у меня есть устройство с зоной памяти, кратной 512 байтам.

Давайте возьмем 2000 байт, так что есть три 512-байтовые зоны плюс 464-байтовая зона

[-512b-]      [-512b-]      [-512b-]      [-464b-]
0     511    512    1023   1024   1535   1536   1999
  • Что я должен передать set_capacity?

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

area1 => 32000 байт
area2 => 512 байт
area3 => 50 байтов
area4 => 45 байтов
area5 => 1024 байта

В этом случае размер жесткого сектора не является постоянным внутри устройства.

  • Как мне заполнить структуру gendisk?

ОБНОВЛЕНИЕ после ответа @KamilCuk:

Чтобы продолжить этот пример, давайте возьмем полную память устройства (33631 байт), которая составляет 65 секторов по 512 байт + 1 сектор по 351 байт.

Таким образом, решения должны быть представлены как:

  • 33270 байт зоны памяти ==> 65 секторов

или

  • 33631 байтовая зона памяти ==> 66 секторов с 161 байтом, сброшенным в конце последнего сектора

Это лучшие решения или есть другой способ справиться с этим конкретным случаем?


  • В основном вопрос можно было бы возобновить до , как инициализировать блочное устройство, если оно не кратно KERNEL_SECTOR_SIZE?

1 Ответ

0 голосов
/ 17 мая 2018
  • What should I pass to set_capacity ?
    From lwm.net article :

    Значение размера должно быть в 512-байтовых секторах, даже если размер сектора оборудования, используемого вашимУстройство отличается.

Передайте, что у вас есть 3 сектора, и, следовательно, совместимы с ядром и игнорируйте последний сектор.
Или передайте, что у вас 4 сектора по 512, отбросьте байты из 464512 на последнем секторе при записи и заполнить нулями при чтении.Убедитесь, что все драйверы, использующие ваш драйвер, знают, что последний сектор меньше и может на него воздействовать.

  • How should I fill the gendisk structure ?
    Верно, с вашей реализацией драйвера блока.Вы реализуете драйвер блока, а не драйвер файловой системы, файлы находятся на верхнем уровне.Файловая система может реализовывать несколько файлов, сохраненных между блоками или в одном блоке базового блочного устройства.(например, btrfs может сжимать небольшие файлы в один блок)
...