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