Книга: Разработка ядра Linux
Освобождение страниц
Освобождение страниц
Для освобождения страниц, которые больше не нужны, можно использовать следующие функции.
void __free_pages(struct page *page, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
void free_page(unsigned long addr);
Необходимо быть внимательными и освобождать только те страницы памяти, которые вам выделены. Передача неправильного значения параметра page
, addr
или order
может привести к порче данных. Следует помнить, что ядро доверяет себе. В отличие от пространства пользователя, ядро с удовольствием зависнет, если вы попросите. Рассмотрим пример. Мы хотим выделить 8 страниц памяти.
page = __get_free_pages(GFP_KERNEL, 3);
if (!page) {
/* недостаточно памяти: эту ошибку необходимо обработать самим! */
return -ENOMEM;
}
/* переменная 'page' теперь содержит адрес
первой из восьми страниц памяти */
free_pages(page, 3);
/*
* наши страницы памяти теперь освобождены и нам больше нельзя
* обращаться по адресу, который хранится в переменной 'page'
*/
Значение GFP_KERNEL
, которое передается в качестве параметра, — это пример флага gfp_mask
, который скоро будет рассмотрен детально.
Обратите внимание на проверку ошибок после вызова функции __get_free_pages()
. Выделение памяти в ядре может быть неудачным, поэтому код должен проверить и при необходимости обработать соответствующую ошибку. Это может означать, что придется пересмотреть все операции, которые были до этого сделаны. В связи с этим, часто имеет смысл выделять память в самом начале подпрограммы, чтобы упростить обработку ошибок. В противном случае после попытки выделения памяти отмена ранее выполненных действий может оказаться сложной.
Низкоуровневые функции выделения памяти полезны, когда необходимы участки памяти, которые находятся в смежных физических страницах, особенно если необходима одна страница или очень большое количество страниц. Для более общего случая, когда необходимо выделить заданное количество байтов памяти, ядро предоставляет функцию kmalloc()
.
- Освобождение объекта Graphics
- Создание типов, предусматривающих освобождение ресурсов и финализацию
- 4.1.3 Освобождение индексов
- 6.5.6 Освобождение области
- Создание объектов, предусматривающих освобождение ресурсов
- Освобождение памяти
- Информация заголовочной страницы (Database header)
- Информация страниц данных
- Статистика страниц индексов
- Размер страницы базы данных
- Типы страниц и их использование
- Дополнительные национальные кодовые страницы и порядки сортировки