struct char_device {
struct list_head hash;
atomic_t count;
dev_t dev;
atomic_t openers;
struct semaphore sem;
};
struct block_device {
struct list_head bd_hash;
atomic_t bd_count;
dev_t bd_dev; /* not a kdev_t - it's a search key */
atomic_t bd_openers;
const struct block_device_operations *bd_op;
struct semaphore bd_sem; /* open/close mutex */
};
Istotny z punktu widzenia plików urządzeń i tablic rozdzielczych jest tutaj fakt, że w strukturze opisującej urządzenie blokowe jest dodatkowe pole bd_op, jest to wskaźnik do zestawu operacji związanych z tym urządzeniem.
Do przechowywania obu numerów danego urządzenia w jednej zmiennej służy typ dev_t. Jest to właściwie zlepek dwóch bajtów. Do jego tworzenia służy makro MKDEV(nr główny, nr podrzędny). Aby uzyskać z tego typu numer główny wykorzystujemy MAJOR(), a dla numeru podrzędnego MINOR(). Jądro nie używa numeru jednak tego typu, a korzysta z kdev_t. Do konwersji między tymi typami służą funkcje:
dev_t kdev_t_to_nr(kdev_t dev); kdev_t to_kdev_t(int dev);