Управление несмежными областями памяти
Мы уже знаем, что предпочтительно отображать области памяти в последовательности смежных страничных кадров, тем самым обеспечивая более эффективное использование кэша и уменьшая среднее время доступа к памяти. Впрочем, если запросы на области памяти выдаются нечасто, есть смысл рассмотреть схему выделения, основанную на несмежных страничных кадрах, обращение к которым происходит через смежные линейные адреса. Основное достоинство этой схемы в том, что она позволяет избежать внешней фрагментации, а недостатком является необходимость обращаться к Таблицам Страниц ядра. Ясно, что размер несмежной области памяти должен быть кратен 4096. Linux по-разному использует несмежные области памяти — например, для выделения структур для активных областей подкачки или для выделения буферов каким-нибудь драйверам ввода/вывода. Кроме прочего, несмежные области памяти предоставляют еще один способ использования страничных кадров из верхней памяти.
Линейные адреса несмежных областей памяти
Чтобы найти свободный интервал линейных адресов, мы можем просмотреть область, начинающуюся с адреса page offset (обычно это ОхсООООООО, начало четвертого гигабайта
как используются линейные адреса четвертого гигабайта
□ начало этой области включает в себя линейные адреса, отображающие первые 896 Мбайт оперативной памяти, а линейный адрес, который соответствует концу физической памяти, отображенной напрямую, хранится В переменной high_memory;
- конец области содержит фиксированно отображенные линейные адреса;
- начиная с адреса pkmap_base, мы видим линейные адреса, используемые для постоянного отображения ядром страничных кадров верхней памяти;
- остальные линейные адреса можно использовать под смежные области памяти. Интервал размером 8 Мбайт (макрос vmalloc offset) вставляется в целях безопасности между концом отображения физической памяти и первой областью памяти. Его предназначение— ловить” обращения к памяти, нарушающие установленные границы. По той же причине дополнительные интервалы по 4 Кбайт вставляются для разделения несмежных областей памяти.
Макрос vmalloc start определяет начальный адрес линейного пространства, зарезервированного под несмежные области памяти, а макрос vmalloc end определяет его конечный адрес.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница