Сегментация в Linux

Сегментация появилась в микропроцессорах 80×86, чтобы стимулировать программистов на разбиение приложений на логически связанные составляющие, такие как подпрограммы и области глобальных или локальных данных. Однако операционная система Linux пользуется сегментацией очень ограниченно. На практике сегментация и выделение страниц в определенной степени функционально перекрываются, поскольку оба подхода можно применять для разбиения физического адресного пространства процессов. Сегментация присваивает процессам разные адресные пространства, а выделение страниц отображает одно пространство линейных адресов в разные пространства физических адресов. Linux предпочитает выделение страниц сегментации по следующим причинам:
— управление памятью упрощается, когда все процессы работают с одинаковыми значениями сегментных регистров, т. е. когда они совместно используют одно множество линейных адресов;
— одной из целей создания Linux была переносимость на широкий спектр архитектур. Архитектуры RISC, например, имеют ограниченную поддержку сегментации.
В версии Linux 2.6 сегментация используется только в тех случаях, когда этого требует архитектура 80×86.
В Linux все процессы, работающие в режиме пользователя, обращаются к одной паре сегментов при адресации инструкций и данных. Эти сегменты называются сегментом пользовательского кода и сегментом пользовательских данных соответственно. Так, например, если необходимо сделать скриншот рабочего стола можно воспользоваться клавишей «Prt Scr». Чтобы сделать скриншот только фрагмента рабочего стола, то можно воспользоваться соответствующим программным обеспечением, которое поддерживается Linux, например, Fine Reader. Более подробную информацию, о том, как сделать скриншот на ноутбуке, вы можете получить на Интернет-ресурсе http://tolevbizsystems.com.
Аналогично, все процессы, работающие в режиме ядра, для этих целей также обращаются к одной паре сегментов — к сегменту кода ядра и к сегменту данных ядра:
— сегмент, включающий локальную таблицу дескрипторов, принятую по умолчанию, которой, как правило, совместно пользуются все процессы;
— сегменты TLS (Thread — Local Storage, локальная память потока). Это механизм, позволяющий многопоточным приложениям использовать до трех сегментов, содержащих данные, независимые для каждого потока. Системные ВЫЗОВЫ set thread area () И get thread area (), соответственно, создают и освобождают сегмент TLS выполняемого процесса;
— три сегмента, имеющих отношение к усовершенствованному управлению питанием, или АРМ (Advanced Power Management). Код BIOS в своей работе пользуется сегментами, так что, когда АРМ — драйвер Linux вызывает функции BIOS, чтобы прочитать или установить статус АРМ — устройств, ему могут потребоваться специальные сегменты кода и данных;
— пять сегментов, имеющих отношение к службам PnP (Plug and Play) BIOS. Как и в предыдущем случае, код BIOS в своей работе использует сегменты, так что, когда PnP-драйвер Linux вызывает функции BIOS, чтобы определить ресурсы, используемые PnP — устройствами, ему могут потребоваться специальные сегменты кода и данных;
— специальный сегмент состояния задачи, используемый кодом ядра для обработки исключений двойных ошибок.
У каждого процессора в системе имеется своя копия глобальной таблицы дескрипторов. Все копии таблицы содержат идентичные записи, за исключением нескольких случаев. Во-первых, у каждого процессора есть собственный сегмент состояния задачи, так что соответствующие записи в таблицах GDT различаются. Кроме того, некоторые записи в глобальной таблице дескрипторов зависят от процесса, выполняемого в данный момент (дескрипторы таблицы LDT и сегментов TLS). Наконец, в отдельных ситуациях процессор может временно изменить запись в своей копии глобальной таблицы дескрипторов; например, это происходит при вызове процедуры BIOS для системы АРМ.