Доступ к блочному устройству из модуля ядра - PullRequest
3 голосов
/ 13 декабря 2010

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

Может кто-нибудь сказать мне, как я могу открыть блок чтения / записи объявлений из модуля ядра? Возможно без использования пользовательской программы для чтения / записи объединенных блочных устройств. Я нашел похожую тему здесь , но ответ был довольно неудовлетворительным, поскольку функции filp_ * предназначены скорее для чтения небольших файлов конфигурации, а не для (больших) операций ввода-вывода блочных устройств.

Поскольку интерфейс для создания блочных устройств стандартизирован, я думал о прямом (или почти прямом) доступе к функциям, реализующим исходные устройства, так как меня в любом случае попросят экспортировать аналогичные функции. Если бы я мог это сделать, я бы просто создал некоторые прокси-функции, вызывающие соответствующие функции на исходных устройствах. Могу ли я как-то получить указатель на структуру gendisk, которая принадлежит другому драйверу?

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

Или кто-то знает, существует ли такой модуль?

Ответы [ 3 ]

4 голосов
/ 13 декабря 2010

Подумайте над проверкой кода для блочных устройств dm / md в drivers/md - эти существующие драйверы создают блочное устройство, которое хранит данные на других блочных устройствах.

На самом деле, вы, вероятно, могли быреализовать свою идею как еще одну «индивидуальность RAID» в md и, таким образом, использовать существующие инструменты пользовательского пространства для настройки устройств.

3 голосов
/ 01 ноября 2014

Исходный код в драйвере устройства отображения соответствует вашим потребностям. Посмотрите на код в исходном коде Linux в Linux / drivers / md / dm - *.

Вам не нужен доступ к структуре gendisk другого устройства, а скорее к его очереди запросов. Вы можете подготовить запросы ввода-вывода и отправить их в очередь на другое устройство, а все остальное сделает сам.

Я реализовал простое блочное устройство, которое открывает другое блочное устройство. Взгляните на мой пост, описывающий это: stackbd: укладка блочного устройства поверх другого блочного устройства

Вот несколько примеров функций, которые вам нужны для доступа к гендиску другого устройства. Способ открытия другого блочного устройства по его пути ("/ dev /"):

struct block_device *bdev_raw = lookup_bdev(dev_path);
printk("Opened %s\n", dev_path);
if (IS_ERR(bdev_raw))
{
    printk("stackbd: error opening raw device <%lu>\n", PTR_ERR(bdev_raw));
    return NULL;
}
if (!bdget(bdev_raw->bd_dev))
{
    printk("stackbd: error bdget()\n");
    return NULL;
}
if (blkdev_get(bdev_raw, STACKBD_BDEV_MODE, &stackbd))
{
    printk("stackbd: error blkdev_get()\n");
    bdput(bdev_raw);
    return NULL;
}

Простейшим примером передачи запроса ввода-вывода с одного устройства на другое является его перераспределение без изменения. Обратите внимание, что в следующем коде запись bi_bdev изменена на другом устройстве. Также можно изменить адрес блока (* bi_sector) и сами данные.

static void stackbd_io_fn(struct bio *bio)
{
    bio->bi_bdev = stackbd.bdev_raw;

    trace_block_bio_remap(bdev_get_queue(stackbd.bdev_raw), bio,
            bio->bi_bdev->bd_dev, bio->bi_sector);

    /* No need to call bio_endio() */
    generic_make_request(bio);
}
0 голосов
/ 13 декабря 2010

Знаете, если вы используете модуль ядра GPL, вы можете просто вызвать open (), read (), write () и т. Д. Из режима ядра, верно?

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

...