В ядре Linux, а также во многих онлайн-учебниках по x86 я вижу, что люди рекомендуют использовать два сегмента кода и два сегмента данных. Я понимаю необходимость двух сегментов кода, поскольку CPL должен точно соответствовать DPL (для несоответствующих сегментов).
Однако ни в одном из этих руководств (и ни в одном из связанных вопросов о StackOverflow) конкретно не говорится, зачем нам нужны два сегмента данных. Они работают иначе, чем сегменты кода, поскольку процесс с CPL=0 может получить доступ к сегменту данных с DPL=3.
Недостатком наличия двух сегментов данных является необходимость перезагрузки регистров DS, ES и т. д., если у нас есть переключение между процессами с разными уровнями привилегий.
Итак, мой конкретный вопрос: учитывая, что мы используем плоскую модель памяти, так что весь код и сегменты полностью перекрываются, какой цели служит наличие пользователя и сегмента данных ядра, а не только одного сегмента пользовательских данных?