Kmap для HIGHMEM
Я использую kmap
чтобы получить логический адрес страницы, но я немного запутался насчет большого объема памяти. Если страница находится в верхней памяти, что делает kmap
вернуть? Один источник говорит, что логический адрес, другой - линейный адрес дескриптора страницы.
Цель состоит в том, чтобы получить прямой доступ к содержимому физических страниц путем преобразования адресов vma в линейный адрес пространства ядра определенных страниц.
2 ответа
kmap всегда возвращает виртуальный адрес, который адресует нужную страницу. Если страница уже доступна - т.е. она уже имеет действительный виртуальный адрес ядра (потому что, скажем, она находится в области FIXADDR и, следовательно, уже сопоставлена), - тогда этот адрес просто возвращается вам. Если он находится в области highmem, то устанавливается временное сопоставление виртуального адреса и возвращается действительный виртуальный адрес памяти.
Преобразование, на которое ссылается ваше последнее предложение, немного двусмысленно, но, поскольку у вас есть "struct page", я предполагаю, что вы имеете в виду страницу, которая пришла из отображения, описанного vm_struct? ("vma" несколько перегружен)
В любом случае, предполагая, что ваша настоящая цель - просто получить адрес, по которому вы можете "напрямую" изменить и исследовать указанное место в произвольной физической памяти в случае, когда у вас уже есть "страница структуры", kmap должен работать для вас.
По определению логический адрес ядра (также называемый линейным адресом) - это виртуальный адрес в пространстве ядра, который можно преобразовать в физический адрес путем вычитания фиксированного смещения.
Диапазон адресного пространства ядра является фиксированным параметром времени компиляции, поэтому, если виртуальное адресное пространство работает от 3G - 4G (скажем), то с низким mem может работать от 3G - OFFSET до 4G - OFFSET. Страницы за пределами этого диапазона занимают много памяти. Поэтому для страницы с большим объемом памяти не может быть логического адреса ядра.
kmap () создает отображение страницы с большим объемом памяти в адресное пространство ядра и возвращает виртуальный адрес, к которому можно получить доступ, чтобы получить доступ к содержимому страницы с большим объемом памяти.