Списки рассеяния ядра непрерывны по виртуальному адресу?

Я хотел бы спросить/проверить, является ли массив struct scatterlist, который был сопоставлен с blk_rq_map_sg, непрерывным, по крайней мере, в домене виртуального адреса. Ну, мы все знаем, что списки рассеяния в первую очередь предназначены для DMA, где каждый элемент массива рассеяния-сбора (sg) описывает фрагмент памяти, и эти фрагменты являются несмежными по своим физическим адресам.

Я пишу драйвер блочного устройства. Предположим, я получаю запросы структуры из очереди request_queue и хочу что-то сделать с данными ввода-вывода, хранящимися в моем запросе, например memcpy отправить их куда-нибудь. Для этой операции потребуется виртуальный адрес и параметр длины. Теперь все, что я знаю, это то, что я могу получить доступ к данным запроса через список разброса, сопоставленный с помощью вспомогательной функции blk_map_rq_sg(). Верно ли мое предположение, что эти элементы sg непрерывны в виртуальном пространстве, и что я могу получить адрес данных через sg_virt() и использовать этот адрес и общую длину для memcpy? Или они несмежны в виртуальном, и мне нужно пройти через каждый элемент массива sg и memcpy в/из каждого блока памяти sg (в виртуальном), что сложнее?


person ubermensch    schedule 12.07.2014    source источник
comment
Вы пробовали изучить результат blk_rq_map_sg? Если они не смежные, то вы не можете сделать предположение, что они смежные. Если они являются смежными, вы все равно не можете предполагать, что это произойдет в 100% случаев.   -  person Drew McGowen    schedule 12.07.2014


Ответы (1)


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

Чтобы получить доступ к содержимому списка SG с помощью ЦП, используйте что-то вроде sg_copy_from_buffer, которое автоматически временно отображает страницы.

person CL.    schedule 13.07.2014