Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

 spinlock_t lru_lock;

 struct list_head active_list;

 struct list_head inactive_list;

 unsigned long nr_scan_active;

 unsigned long nr_scan_inactive;

 unsigned long nr_active;

 unsigned long nr_inactive;

 int all_unreclaimable;

 unsigned long pages_scanned;

 int temp_priority;

 int prev_priority;

 struct free_area free_area[MAX_ORDER];

 wait_queue_head_t *wait_table;

 unsigned long wait_table_size;

 unsigned long wait_table_bits;

 struct per_cpu_pageset pageset[NR_CPUS];

 struct pglist_data *zone_pgdat;

 struct page *zone_mem_map;

 unsigned long zone_start_pfn;

 char *name;

 unsigned long spanned_pages;

 unsigned long present_pages;

};

Эта структура большая, но в системе всего три зоны и соответственно три такие структуры. Рассмотрим наиболее важные поля данной структуры.

Поле

lock
— это спин-блокировка, которая защищает структуру от параллельного доступа. Обратите внимание, что она защищает только структуру, а не страницы, которые принадлежат зоне. Для защиты отдельных страниц нет блокировок, хотя отдельные части кода могут блокировать данные, которые могут оказаться в указанных страницах.

Поле

free_pages
— это количество свободных страниц в соответствующей зоне. Ядро старается поддерживать свободными хотя бы
pages_min
страниц зоны, если это возможно (например, с помощью вытеснения на диск).

Поле

name
 — это строка, оканчивающаяся нулем, которая содержит имя соответствующей зоны (что не удивительно). Ядро инициализирует указанное поле при загрузке системы с помощью кода, который описан n файле
mm/page_alloc.с.
Три зоны имеют имена "DMA", "Normal" и "HighMem".

Получение страниц памяти

Теперь, имея некоторое понятие о том, как ядро управляет памятью с помощью страниц, зон и так далее, давайте рассмотрим интерфейсы, которые реализованы в ядре для того, чтобы выделять и освобождать память внутри ядра. Ядро предоставляет один низкоуровневый интерфейс для выделения памяти и несколько интерфейсов для доступа к ней. Все эти интерфейсы выделяют память в объеме, кратном размеру страницы, и определены в файле

<linux/gfp.h>
. Основная функция выделения памяти следующая.

struct page * alloc_pages(unsigned int gfp_mask, unsigned int order);

Данная функция позволяет выделить 2

order
(т.е.
1 << order
) смежных страниц (один непрерывный участок) физической памяти и возвращает указатель на структуру
page
, которая соответствует первой выделенной странице памяти. В случае ошибки возвращается значение
NULL
. Параметр
gfp_mask
будет рассмотрен несколько позже. Полученную страницу памяти можно конвертировать в ее логический адрес с помощью следующей функции.

void *page_address(struct page *page);

Эта функция возвращает указатель на логический адрес, которому в данный момент соответствует начало указанной страницы физической памяти. Если нет необходимости в соответствующей структуре

struct page
, то можно использовать следующую функцию.

unsigned long __get_free_pages(unsigned int gfp_mask,

 unsigned int order);

Эта функция работает так же, как и функция

alloc_pages
, за исключением того, что она сразу возвращает логический адрес первой выделенной страницы памяти. Так как выделяются смежные страницы памяти, то другие страницы просто следуют за первой.

Если необходима всего одна страница памяти, то для этой цели определены следующие функции-оболочки, которые позволяют уменьшить количество работы по набору кода программы.

struct page * alloc_page(unsigned int gfp_mask);

unsigned long __get_free_page(unsigned int gfp_mask);

Эти функции работают так же, как и ранее описанные, по для них в качестве параметра

order
передается нуль (20 = одна страница памяти).

  • Читать дальше
  • 1
  • ...
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: