Перейти к содержанию

Выделение памяти в модуле ядра


Гость

Рекомендуемые сообщения

Задача такая: модуль выделяет память и руализует вызов mmap для отображения этой памяти в пространство пользователя. Модуль писался в соответствии с примерами Рубини. Работает он следующим образом:

1. Памяти выделяется в init_module с помощью <адрес> = __get_free_pages(GFP_KERNEL, 4);

2. Память освобождается в cleanup_module с помощью free_pages(<адрес>);

3. В реализации nopage в конце вызывается get_page();

При этом происходят не понятные вещи:

1. При выделении нескольких страниц счетчик использования равен 1 только для первой страницы, для оствльеых - 0. Посмотрел реализацию процедуры выделения - действительно, только для первой страницы. Почему?

2. При выгрузке модуля выделенная память назаж не возвращается - проверял с помощью утилиты free

3. После обращения пользователя к выделенным страницам, выгрузке модуля и повторной загрузке система палает намертво. При этом, если при выдалении принудительно сделать get_page на все страницы, кроме первой - этого не происходит.

Кто может, объясните, pliz, почему так происходит и в чем я не прав?

Ссылка на комментарий
Поделиться на другие сайты

1) юзай kmalloc/kfree:

если выделяешь память внутри обработчика прерываний, юзай

char* ptr = kmalloc(100, GFP_ATOMIC);

если в обычной ситуации (когда возможен scheduling), можешь

char* ptr = kmalloc(100, GFP_KERNEL);

2) Как падает система?

напиши в какой строке какого файла BUG,

внизу core-dump'а написана причина остановки

(Segmentation fault, Killing interrupt handler, ...)

Ссылка на комментарий
Поделиться на другие сайты

> юзай kmalloc/kfree:

kmalloc использовать не хочется, Рубини что-то писал про ее ограния на объем памяти, точно уже не помню.

> внизу core-dump'а написана причина остановки

Коре-дамп посмотреть не вижу возможности, так как падает ядро со страшным грохотом, информации пишет больше, чем объем экрана, а потом просто глухо висит. Логов этого дела я пока не нашел.

Проблему с отображением страниц решил путем установки флага PG_reserved для каждой страницы, перед вызовом __free_pages этот флаг сбрасываю, отображение при этом можно делать как через remap_page_range, так и через nopage. Одно не понятно, почему, судя по показаниям утилиты free, при выгрузке модуля не возвращается память?

Ссылка на комментарий
Поделиться на другие сайты

ОЧЕНЬ ПРОШУ!!!

ВЫШЛИТЕ ПОЖАЛУЙСТА ВСЕ МАТЕРИАЛЫ ДОСТУПНЫЕ ВАМ ПО ЭТОМУ ВОПРОСУ (разделение памяти между ядром и пользовательским процессом).

Я уже два месяца решаю смежную проблему - пока тупик.

Что такое "примеры Рубини"?

ОЧЕНЬ ПРОШУ!!!

С уважением, Князев Алексей. knzsoft@mail.ru

Ссылка на комментарий
Поделиться на другие сайты

2 Князев Алексей: Я пользовался книгой "Linux Device Drivers, 2nd Edition" авторов Alessandro Rubini & Jonathan Corbet. Вот ссылка: http://www.xml.com/ldd/chapter/book/index.html, про отображение памяти глава 13. Только не знаю, есть ли там исходники примеров, если нет - могу выслать.

Удачи

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...