2013-06-04 4 views
0

Я работаю над модулем ядра Linux, который требует от меня проверки данных непосредственно перед записью на локальный диск. Данные, которые нужно записать, извлекаются с удаленного диска. Поэтому я знаю, что данные из выборки хранятся в кеше страницы. Я также знаю, что Linux имеет структуру данных, которая управляет блочными вводами-выводами в полете, называемыми биоструктурой.Доступ к данным буфера из bio struct в Linux

Биоструктура содержит список структур, называемых bio_vecs.

struct bio_vec { 

/* pointer to the physical page on which this buffer resides */ 
struct page *bv_page; 

/* the length in bytes of this buffer */ 
unsigned int bv_len; 

/* the byte offset within the page where the buffer resides */ 
unsigned int bv_offset; 
}; 

У этого есть список из них, поскольку представление блока в памяти не может быть физически смежным. То, что я хочу сделать, это захватить каждую часть буфера, используя список bio_vecs, и собрать их вместе, чтобы я мог взять хэш MD5 блока. Как использовать указатель на страницу, длину буфера и его смещение, чтобы получить необработанные данные в буфере? Существуют ли уже функции для этого или я должен написать свои собственные?

+1

ли вы посмотреть на LWN? Есть хорошая статья, которая появляется в поиске Google ... http://lwn.net/Articles/26404/ – granquet

+0

Вы смогли найти информацию об этом? – aminfar

ответ

-1

Вы можете использовать bio_data (struct bio * bio) функция для доступа к данным.
Доступ к данным из bio_data может быть проблематичным, так как его тип возврата недействителен * (так что% S не работает), но он может быть успешно решен путем небольшого тиража.
Ниже приведен фрагмент кода, который будет выполнять работу:

char *ptr; 
ptr=(char *)bio_data(bio); 
for(i=0;i<4096;i++) //4096 as bio is going to be in 4kb chunk 
{ 
    printk("%c",*ptr); 
    ptr++; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^