В настоящее время я изучаю программирование драйверов ядра, используя Драйверы устройств 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?