Мне было интересно, почему нам нужно переключаться в пространство ядра, когда мы хотим получить доступ к аппаратному устройству. Я понимаю, что иногда для определенных действий, таких как выделение памяти, нам нужно сделать системные вызовы, чтобы переключиться из пространства пользователя в пространство ядра, потому что операционной системе нужно все организовать и разделить процессы и то, как они используют память, и другие . Но почему мы не можем напрямую получить доступ к аппаратному устройству?
Почему приложения не могут напрямую обращаться к аппаратному устройству? Почему нам нужно переключиться на пространство ядра, чтобы сделать это?
Ответы (2)
Драйвер устройства может предоставлять доступ из пользовательских процессов к регистрам устройства, памяти устройства или к тому и другому. Обычный метод — служба для конкретного устройства, связанная с запросом mmap(). Рассмотрим встроенную память кадрового буфера и эффективность пользовательского процесса, который может напрямую считывать и записывать это пространство. Для устройств в целом, в частности, существуют соображения безопасности, и драйверы, обеспечивающие прямой доступ, часто устанавливают ограничения для процессов с достаточными учетными данными. Файлы в /dev обычно устанавливаются с аналогичными ограничениями прав доступа владельца/группы.
Нет проблем с написанием собственного драйвера для доступа к оборудованию из пользовательского пространства, и доступно множество документации. Например, этот учебник на xatlantis кажется недавний и хороший источник.
Причина, по которой он был разработан таким образом, заключается в том, что в основном из-за соображений безопасности. Большинство систем, о которых я знаю, специально не позволяют пользовательским программам выполнять ввод-вывод или получать доступ к памяти пространства ядра. Такие вещи привели бы к крайне небезопасным системам, потому что, имея доступ к ядру, пользовательская программа могла бы изменить разрешения и получить доступ к любым данным в любом месте системы и, предположительно, изменить их.
Ссылки: XATLANTIS STACKEXCHANGE