Драйвер блочного устройства может позвонить blk_register_region()
, чтобы взять на себя ответственность за больший диапазон номеров устройств. Например, при инициализации драйвера ramdisk он вызывает blk_register_region для запроса всех возможных ram-дисков.
static int __init brd_init(void)
{
// ...
blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS,
THIS_MODULE, brd_probe, NULL, NULL);
return 0;
}
Драйверы, такие как ramdisk и floppy, регистрируются под своим собственным номером основного устройства (RAMDISK_MAJOR / FLOPPY_MAJOR
определено в major.h). Но я прочитал код
из blk_register_region и обнаружил, что эта функция поддерживает регистрацию устройства разных старших номеров за один вызов.
Функция blk_register_region просто оборачивает kobj_map. Кроме того, kobj_map поддерживает создание до 255 основных устройств за один вызов. Откуда это нужно?
void blk_register_region(dev_t devt, unsigned long range, struct module *module,
struct kobject *(*probe)(dev_t, int *, void *),
int (*lock)(dev_t, void *), void *data)
{
kobj_map(bdev_map, devt, range, module, probe, lock, data);
}
int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,
struct module *module, kobj_probe_t *probe,
int (*lock)(dev_t, void *), void *data)
{
// calculate the range of major numbers
unsigned n = MAJOR(dev + range - 1) - MAJOR(dev) + 1;
unsigned index = MAJOR(dev);
unsigned i;
struct probe *p;
if (n > 255)
n = 255;
p = kmalloc(sizeof(struct probe) * n, GFP_KERNEL);
if (p == NULL)
return -ENOMEM;
// ....
}
Спасибо заранее.