Вопрос о direct I/O (get_user_pages)
Добавлено: 27 мар 2013, 13:13
В драйвере есть необходимость доступа к структурам данных процесса пользователя, а имеенно нужно отобразить пользовательскую структуру данных, которая занимает ок 18 Мб, на виртуальные адреса ядра. Для этого в ядрах > 2.6 используется механизм direct I/O (в замен старого kiobuf).
Существует функция get_user_pages, которая и реализовывает этот механизм.
Механизм работы функции таков, что она берёт размер и указатель на виртуальный адрес (внимание) непрервыного!!! пользовательского пространства, и возвращает указатели на страницы физической памяти текущего процесса. Затем в ядре (в драйвере), есть возможность получить (вызовом kmap) виртуальные адресса ядра, указывающие на эти страницы. Есть одно но - отображение не является линейным. Т.е. в ядре пользовательская структура данных (которая, повторюсь, непрерывна в виртуальном адрессном пространстве процесса) разбивается на куски размером в PAGE_SIZE, которые в виртуальном адрессном пространстве ядра находятся разрозненно! По сути вопрос - как "склеить" эти куски, что бы в ядре можно было работать с указателем на структуру данных, а не участками данных размером в страницу.
Существует функция get_user_pages, которая и реализовывает этот механизм.
Механизм работы функции таков, что она берёт размер и указатель на виртуальный адрес (внимание) непрервыного!!! пользовательского пространства, и возвращает указатели на страницы физической памяти текущего процесса. Затем в ядре (в драйвере), есть возможность получить (вызовом kmap) виртуальные адресса ядра, указывающие на эти страницы. Есть одно но - отображение не является линейным. Т.е. в ядре пользовательская структура данных (которая, повторюсь, непрерывна в виртуальном адрессном пространстве процесса) разбивается на куски размером в PAGE_SIZE, которые в виртуальном адрессном пространстве ядра находятся разрозненно! По сути вопрос - как "склеить" эти куски, что бы в ядре можно было работать с указателем на структуру данных, а не участками данных размером в страницу.