2014-06-01 4 views
0

Мне нужен драйвер linux для получения физической памяти выделенного блока памяти: это FPGA SOC, и память передается модулю SGPMA FPGA.Какая реализация для получения памяти с ее физическим адресом верна?

Это сводится к путанице «логический» против «virutual» памяти: они являются синоним антонимичными?

Мой водитель фрагмент код таким образом:

unsigned long m = __get_free_pages(GFP_USER, order); // returns 'logical' address 
if (m) { 
    instance->read_buffer[i].order = order; 
    if(1) { // should this be 0? 
     instance->read_buffer[i].virtual = (void *)m; 
     instance->read_buffer[i].physical = virt_to_phys((void *)m); 
    } else { // seems like the correct option as no casts are required 
     instance->read_buffer[i].physical = m 
     instance->read_buffer[i].virtual = phys_to_virt(m); 
} 

Где ОПРЕДЕЛЕНИЯ структур являются:

struct my_structure { 
... 
    unsigned long physical; 
    void * virtual; 
... 
}; 

И будет компилировать без жалоб (изменение if (0) к if (1)), но я не» Знаю, что правильно.

ответ

0

if(1) является правильным.

Вот цитаты о линукс ядро ​​адресации типа из главы 15 из LDD3 book:

Kernel логические адреса Они составляют нормальное адресное пространство ядра. Эти адреса отображают некоторую часть (возможно, все) основной памяти и часто обрабатываются так, как если бы они были физическими адресами. На большинстве архитектур логические адреса и связанные с ними физические адреса отличаются только постоянным смещением. ... Память, возвращаемая из kmalloc, имеет логический адрес ядра.

ядра виртуальные адреса ядра виртуальные адреса похожи на логические адреса в том, что они являются Map- пинг из ядра пространства адреса в физический адрес. Однако виртуальные адреса ядра не обязательно имеют линейное сопоставление «один к одному» к физическим адресам, которые характеризуют логическое адресное пространство. Все логические адреса - это виртуальные адреса ядра, но многие виртуальные адреса ядра не являются логическими адресами.

+0

Спасибо. Я видел эти цитаты: но бит, который вводил меня в заблуждение, был «... часто трактуется так, как если бы они были физическими адресами ...» _, что означает, что его можно интерпретировать как «иногда они не как] физические адреса ". – Jamie

+0

Немного копания: из главы 8 LDD3: «Стоит подчеркнуть, что адреса памяти, возвращаемые kmalloc и _get_free_pages , также являются виртуальными адресами». _ Это, полностью * ясно. – Jamie

+0

@Jamie, логические адреса могут быть равны физическому по некоторым архитектурам, но обычно это неверно. Вот почему вы используете '__virt_to_phys' для преобразования виртуального на физический адрес. Найдите '__virt_to_phys' внутри' kernel-src/arch/', чтобы узнать, как это реализовано в вашей архитектуре. – alexander

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