Наиболее очевидное преимущество использования кольца 1 и 2 были бы архитектурным разделом, который мог бы защитить ядро от неисправного драйвера устройства. Теоретически правильно написанное ядро позволило бы изящный сбой, когда драйвер во внешнем кольце имел катастрофический сбой. Запуск драйвера в кольце 0 может потенциально позволить ему удалить все ядро, если оно не работает.
Недостатком перемещения драйверов в кольца 1 и 2 было бы накладные расходы на производительность, связанные с постоянной необходимостью кольцевых переходов между ядром и драйверами. Конечно, в микроядерной системе, this is necessary and could be sufficiently fast depending on your needs. При правильной оптимизации отключение ядра от его сервисов может иметь очень малую производительность. С учетом сказанного, Intel /SYSEXIT
(и эквивалентные AMD SYSCALL
/SYSRET
) инструкции, используемые для быстрого переключения контекста только позволяют переходы между кольцами 0 и 3; для выполнения контекстного переключения в или из колец 1 или 2 требуется полное прерывание.
Еще один недостаток необходимо учитывать, что, поскольку многие другие архитектуры имеют только супервизор и пользовательские режимы (или эквивалент) любую архитектуру платформы вы пишете, что управляет каким уровень элементов вашего кода запуска на придется как:
- записываются по-разному в зависимости от того, имеет ли платформа кольца 1 и/или 2 и
- принять другое решение о том, какой уровень привилегий имеет код в зависимости от платформы.
Если вы планируете создать систему, которая будет построена для разных архитектур, это может привести к некоторым трудностям.
Также обратите внимание, что поисковая система имеет только «пользователь» и «супервизор». Любое кольцо 1 или код кольца 2 может обращаться к страницам «супервизора» (например, к мусорному кольцу 0 страниц ядра); и поэтому есть либо небольшая точка, использующая кольцо 1 или кольцо 2, либо вы должны использовать сегментацию для обеспечения защиты, а не пейджинга (что является очень плохой идеей для производительности) – Brendan