(Следующее упрощено, но должно дать вам общее представление)
Устройство представляет собой аппаратное обеспечение, напрямую подключенное к ЦП (редко, если это не шина), или косвенно подключенное через шину (которая сама является устройством). Устройства могут связываться с ЦП любым из четырех способов: адреса памяти, адреса ввода-вывода, каналы DMA и IRQ. (Эпоха, в которую вам приходилось беспокоиться, давно прошла, она умерла вместе с ISA).
Одна из причин, по которой у нас есть операционные системы, заключается в предоставлении общего интерфейса для взаимодействия с типами оборудования. Таким образом, те, кто пишет программы, могут использовать этот общий интерфейс вместо того, чтобы быть осведомленными о деталях низкого уровня каждого конкретного устройства. Это делает программирование быстрее и проще.
Драйвер - это часть программного обеспечения, которая представляет этот общий интерфейс на стороне приложения и затем преобразует запросы, используя этот интерфейс, в форму, которую может обрабатывать устройство (используя вышеупомянутые адреса памяти, адреса ввода-вывода, каналы DMA и IRQ, или, возможно, звоню другим водителям) и обратно.
Linux, будучи операционной системой в стиле UNIX, использует один конкретный "общий интерфейс", называемый UNIX API. Одна из целей разработки UNIX - сделать так, чтобы все выглядело как файл. Вы можете выполнять следующие операции с файлами: создавать, читать, писать, искать и закрывать. Для вещей, которые не вписываются в эти концепции, есть еще одна операция под названием ioctl, которая является своего рода "универсальным" для всего остального.
Если вы отправляете запросы на эти операции над файлом устройства, запросы направляются не на уровень файловой системы ядра, а непосредственно на устройство.
Теперь у вас есть файлы устройств, которые позволяют вам общаться с устройствами хранения на низком уровне (/dev/sda и т.д.), Но устройства хранения действительно глупы. Все, что они могут сделать с помощью API UNIX, - это предоставить вам LBA или блок данных (512, 2048 или 4096 байт) или сохранить их (современные жесткие диски имеют десятки миллионов LBA, если не больше). Они не организовывают это в файлы самостоятельно. Например, запись в файл может включать запись во многие LBA, и вам нужна система, чтобы отслеживать, какие LBA принадлежат какому файлу. Это задача уровня файловой системы ядра, преобразовывающая запросы на операции над файлами в запросы на операции на устройствах и использующая часть хранилища этого устройства для отслеживания всего.
Уровень файловой системы - это то, что реализует всю систему каталогов. Это древовидная структура, и вы можете присоединять или монтировать блочные устройства в различных точках этого дерева. Слой файловой системы должен знать, какое «низкоуровневое» устройство имеет файлы, и поэтому вам необходимо его смонтировать.