Я хотел бы спросить/проверить, является ли массив struct scatterlist
, который был сопоставлен с blk_rq_map_sg
, непрерывным, по крайней мере, в домене виртуального адреса. Ну, мы все знаем, что списки рассеяния в первую очередь предназначены для DMA, где каждый элемент массива рассеяния-сбора (sg) описывает фрагмент памяти, и эти фрагменты являются несмежными по своим физическим адресам.
Я пишу драйвер блочного устройства. Предположим, я получаю запросы структуры из очереди request_queue и хочу что-то сделать с данными ввода-вывода, хранящимися в моем запросе, например memcpy
отправить их куда-нибудь. Для этой операции потребуется виртуальный адрес и параметр длины. Теперь все, что я знаю, это то, что я могу получить доступ к данным запроса через список разброса, сопоставленный с помощью вспомогательной функции blk_map_rq_sg()
. Верно ли мое предположение, что эти элементы sg непрерывны в виртуальном пространстве, и что я могу получить адрес данных через sg_virt()
и использовать этот адрес и общую длину для memcpy
? Или они несмежны в виртуальном, и мне нужно пройти через каждый элемент массива sg и memcpy
в/из каждого блока памяти sg (в виртуальном), что сложнее?
blk_rq_map_sg
? Если они не смежные, то вы не можете сделать предположение, что они смежные. Если они являются смежными, вы все равно не можете предполагать, что это произойдет в 100% случаев. - person Drew McGowen   schedule 12.07.2014