Z ONE_H IGHMEM
Предположим, например, что ядро вызвало функцию get_free_
pages (gfp highmem, 0), чтобы выделить страничный кадр в верхней памяти. Если аллокатор выделяет страничный кадр в верхней памяти, функция
get free pages не может возвратить его линейный адрес, поскольку он не существует. Поэтому функция возвращает null. Ядро не может использовать выделенный страничный кадр, и, что еще хуже, он не может быть освобожден, потому что ядро потеряло его след.
Эта проблема не возникает на 64-разрядных платформах, поскольку на них пространство линейных адресов превышает объем устанавливаемой оперативной памяти. Короче говоря, в таких архитектурах зона zone highmem всегда пуста. На 32-разрядных платформах, таких как 80x86, разработчикам операционной системы Linux пришлось искать способ, позволяющий ядру эксплуатировать всю доступную оперативную память, вплоть до 64 Гбайт, поддерживаемую механизмами РАЕ. Принятый подход заключается в следующем:
- выделение страничных кадров в верхней памяти происходит только с помощью функции aiioc pages о и ее специализированного варианта aiioc pageO. Эти функции не возвращают линейный адрес первого выделенного страничного кадра, потому что в случае принадлежности страничного кадра верхней памяти такой линейный адрес просто не существует. Зато функции возвращают линейный адрес дескриптора первого выделенного страничного кадра. Эти линейные адреса существуют в любом случае, поскольку все дескрипторы страниц выделяются раз и навсегда в нижней памяти на этапе инициализации ядра;
- страничные кадры в верхней памяти, не имеющие линейного адреса, недоступны ядру. Поэтому часть последних 128 Мбайт пространства линейных адресов ядра предназначена для отображения страничных кадров верхней памяти. Конечно, это временное отображение; в противном случае были бы доступны только 128 Мбайт верхней памяти. Благодаря циклическому характеру отображения доступна вся оперативная память, хотя и не сразу.
Для отображения страничных кадров верхней памяти ядро применяет три различных механизма: постоянное отображение, временное отображение и
выделение несмежной памяти. В этом разделе мы обсуждаем первые две техники; третья описана в разд. "Управление несмежными областями памяти" далее в этой главе.
Создание ядром постоянного отображения может блокировать текущий процесс. Это происходит при отсутствии свободных записей в Таблице Страниц, которые могут быть использованы в качестве окон” для страничных кадров в верхней памяти. Следовательно, ядро не может создать постоянное отображение в обработчиках прерываний и в функциях отложенного выполнения. С другой стороны, установка временного отображения ядром никогда не приведет к блокированию текущего процесса. Недостатком такого подхода является очень небольшое количество временных отображений, устанавливаемых одновременно.
Управляющий тракт ядра, использующий временное отображение, должен обеспечить невозможность использования того же отображения другим потоком. Иными словами, управляющий тракт ядра нельзя блокировать, т. к. в противном случае другой управляющий тракт сможет воспользоваться тем же окном для отображения другой страницы верхней памяти.
Конечно, ни одна из этих техник не позволяет сразу обратиться ко всей оперативной памяти. В конце концов, для отображения верхней памяти остается 128 Мбайт пространства линейных адресов, в то время как механизм РАЕ поддерживает системы, имеющие до 64 Гбайт оперативной памяти.
Предыдущая страница | 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 | Следующая страница