IOBlockStorageDevice и blockSizes, избегая ограничений спецификаций

У меня создано устройство IOBlockStorageDevice, которое сообщает размер блока, установленный пользователем. Создает запись /dev/diskX для диска. Если reportBlockSize возвращает 4096, и сделана попытка записи одного блока, он записывает ровно 1 блок.

Если используется размер блока 512, запрос записи одного блока становится 8-блочным чтением, за которым следует 8-блоковая запись. (как отмечено в doAsyncReadWrite).

Я считаю, что отследил это до spec_vnops.c spec_write()

543                 devBlockSize = vp->v_specsize;
544                 if (devBlockSize > PAGE_SIZE)
545                         return(EINVAL);
546 
547                 bscale = PAGE_SIZE / devBlockSize;
548                 blkmask = bscale - 1;
549                 bsize = bscale * devBlockSize;

Если блок меньше, чем PAGE_SIZE(4096), тогда установите bsize равным 4096, и в приведенном ниже условном выражении он решает сначала вызвать read, а затем write.

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

Это кажется довольно ограниченным, и мне интересно, есть ли способ избежать использования specfs. Поскольку я создаю свое устройство с помощью IOkit, я предполагаю, что оно устанавливает vnops для спецификаций где-то глубоко внутри. Таким образом, даже если бы я сделал свои собственные спецификации vnops, у меня не было бы возможности их установить?

Как только файловая система смонтирована на устройстве, она будет использовать разные vnops, и все в порядке. Но трудно даже разбить устройство на части, если, например, размер блока равен 8192.

1 ответ

bdevsw_add call глубоко в BLOB-объекте devfs, вызываемом iokit, всегда присоединяет specfs vnops. Дарвин не позволяет вам менять vnops на vnode. Поэтому нереально / нежелательно пытаться сделать это. Узлы /dev/, созданные IOkit, должны оставаться как есть и использоваться с GUI и ограничениями размера блока.

Вместо этого мне придется создать второй набор устройств BLK и CHR (вне зависимости от того, внутри или снаружи / dev) и подключить мои собственные vnops, которые могут обрабатывать любые размеры блоков. Эти узлы будут использоваться для не связанных с GUI вещей. (объемы приложений, которые специфические требования к размеру блока).

Другие вопросы по тегам