Гость Опубликовано 29 февраля, 2004 Жалоба Поделиться Опубликовано 29 февраля, 2004 Задача такая: модуль выделяет память и руализует вызов 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, почему так происходит и в чем я не прав? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 марта, 2004 Жалоба Поделиться Опубликовано 3 марта, 2004 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, ...) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 марта, 2004 Жалоба Поделиться Опубликовано 4 марта, 2004 > юзай kmalloc/kfree: kmalloc использовать не хочется, Рубини что-то писал про ее ограния на объем памяти, точно уже не помню. > внизу core-dump'а написана причина остановки Коре-дамп посмотреть не вижу возможности, так как падает ядро со страшным грохотом, информации пишет больше, чем объем экрана, а потом просто глухо висит. Логов этого дела я пока не нашел. Проблему с отображением страниц решил путем установки флага PG_reserved для каждой страницы, перед вызовом __free_pages этот флаг сбрасываю, отображение при этом можно делать как через remap_page_range, так и через nopage. Одно не понятно, почему, судя по показаниям утилиты free, при выгрузке модуля не возвращается память? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 5 марта, 2004 Жалоба Поделиться Опубликовано 5 марта, 2004 ОЧЕНЬ ПРОШУ!!! ВЫШЛИТЕ ПОЖАЛУЙСТА ВСЕ МАТЕРИАЛЫ ДОСТУПНЫЕ ВАМ ПО ЭТОМУ ВОПРОСУ (разделение памяти между ядром и пользовательским процессом). Я уже два месяца решаю смежную проблему - пока тупик. Что такое "примеры Рубини"? ОЧЕНЬ ПРОШУ!!! С уважением, Князев Алексей. knzsoft@mail.ru Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 5 марта, 2004 Жалоба Поделиться Опубликовано 5 марта, 2004 2 Князев Алексей: Я пользовался книгой "Linux Device Drivers, 2nd Edition" авторов Alessandro Rubini & Jonathan Corbet. Вот ссылка: http://www.xml.com/ldd/chapter/book/index.html, про отображение памяти глава 13. Только не знаю, есть ли там исходники примеров, если нет - могу выслать. Удачи Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 6 марта, 2004 Жалоба Поделиться Опубликовано 6 марта, 2004 to procopus: Спасибо за информацию. Буду рад посмотреть любые исходники на эту тему. С уважением, Князев Алексей. knzsoft@mail.ru Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.