Мне нужен драйвер 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)
), но я не» Знаю, что правильно.
Спасибо. Я видел эти цитаты: но бит, который вводил меня в заблуждение, был «... часто трактуется так, как если бы они были физическими адресами ...» _, что означает, что его можно интерпретировать как «иногда они не как] физические адреса ". – Jamie
Немного копания: из главы 8 LDD3: «Стоит подчеркнуть, что адреса памяти, возвращаемые kmalloc и _get_free_pages , также являются виртуальными адресами». _ Это, полностью * ясно. – Jamie
@Jamie, логические адреса могут быть равны физическому по некоторым архитектурам, но обычно это неверно. Вот почему вы используете '__virt_to_phys' для преобразования виртуального на физический адрес. Найдите '__virt_to_phys' внутри' kernel-src/arch/', чтобы узнать, как это реализовано в вашей архитектуре. – alexander