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);