Может ли первый адрес одномерного массива быть передан sg_init_one в качестве баффа?

#c #linux #memory #kernel

#c #линукс #память #ядро

Вопрос:

Я новичок в ядре Linux.

Я учусь использовать крипто-API ядра Linux и получаю пример кода по этой ссылке «https://www.kernel.org/doc/html/latest/crypto/api-samples.html#code-example-for-symmetric-key-cipher-operation»

Я заметил, что пример кода используется sg_init_one(amp;sg, data, datasize); для привязки data баффа к scatterlist структуре. Наконец, определенный алгоритм шифрования получит поддержку данных, которые вызывающий абонент хочет передать из sg.

Но когда я использую массивный бафф и передаю его sg_init_one как data .

например

 u8 data[32]; struct scatterlist sg; const size_t datasize = 32;  sg_init_one(amp;sg, data, datasize);  

Но алгоритм шифрования, получающий данные из sg, не соответствует необработанным данным, и проанализированный виртуальный адрес также не соответствует.

Похоже, что виртуальный адрес u8 data[32]; передается неправильно, почему? В этом случае есть ли какая-либо разница между одномерным массивом и указателем первого уровня?

Я также обнаружил , что sg_init_one позвоню sg_set_page и просмотрю страницу баффа virt_to_page . Связано ли это с различием между указателями и массивами в управлении памятью ядра, которое вызывает ошибку при получении страницы?