Допустим, у нас есть struct page
из адресного пространства кэшированного файла страницы.
Как мы можем получить начальный физический адрес данных размером 4 КБ из этого struct page
?
Я полагаю, внутри struct sk_buff
должно быть что-то вроде указателя data
, но я его не нашел.
РЕДАКТИРОВАТЬ
Спасибо Мэту и Илье за ответы.
Посмотрев на ответы, я думаю, что первая проблема состоит в том, чтобы определить, находится ли struct page
в ZONE_NORMAL
или ZONE_HIGHMEM
.
Во время файлового ввода-вывода, когда мы не находим кэшированную страницу, мы сначала выделяем новую страницу, используя page_cache_alloc_cold()
. page_cache_alloc_cold()
наконец вызовет alloc_pages()
, который выглядит так, как будто он будет использовать ZONE_HIGHMEM
(, который в x86 является областью памяти ядра, начинающейся с PAGE_OFFSET
+896M)для своей работы.
Итак,
ZONE_NORMAL
kmap()
, чтобы найти начальный физический адрес данных 4 КБ, связанных со страницей структуры, правильно ли мы должны использовать (unsigned long)(&page)-PAGE_OFFSET
найти физический адрес, где хранится сама структура?Пожалуйста, исправьте.