2016-08-17 1 views
1

Мне нужен мой драйвер, чтобы вернуть значение phys_addr_t с помощью вызова ioctl. Мне нужно вернуть это значение через структуру, которая передается через arg. Вопрос в том, какой тип я использую в этой структуре?как вернуть значение типа phys_addr_t в пользовательское пространство

Например, сказать следующая структура передается через арг

struct myStruct { 
    int input1; 
    char input2; 
    <type> physAddr; 
} ; 


someStruct.physAddr = virt_to_phys(virtAddr); 

virt_to_phys возвращающий phys_addr_t, однако этот тип, кажется, не существует ни в одном из стандарта включает в себя. Итак, мой вопрос - какой тип мне нужно использовать в пользовательском пространстве для phys_addr_t?

+1

Физические адреса не имеют смысла вне ядра. – Barmar

+1

@ Бармар, я знаю. Но это не вопрос, который я задавал. Вопрос по-прежнему стоит, какой тип мне нужно использовать в пространстве пользователя или что мне нужно включить в мой файл, чтобы увидеть значение 'physAddr'? – flashburn

+2

'unsigned long'? http://man.cx/virt_to_phys%289%29 – yano

ответ

3

Под полным источником ядра, в include/linux/types.h мы имеем:

#ifdef CONFIG_PHYS_ADDR_T_64BIT 
typedef u64 phys_addr_t; 
#else 
typedef u32 phys_addr_t; 
#endif 

Таким образом, чтобы быть в безопасности, используйте только u64.

Обратите внимание, что это определение удалено из /usr/include/linux/types.h.

Однако, если вы пишете настраиваемую утилиту, которая взаимодействует с настраиваемым устройством и его настраиваемым драйвером, можно пропустить версии /usr/include и построить прямо против версии (например, /usr/src/kernel/...).

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

Например, платформа для кодирования видео в реальном времени, я написал код для этого. Драйвер отправил данные на устройство. Устройство отправило данные обратно. Данные были отправлены в программу утилиты/управления, которая изменила данные и отправила их обратно и т. Д. Это было сделано с помощью лота пользовательских звонков ioctl, поэтому мы могли делать все, что было необходимо.

1

Это либо 32, либо 64 бит, без знака. См. Здесь: http://lxr.free-electrons.com/source/include/linux/types.h#L161

В некоторой степени вы можете использовать intptr_t, но я был бы обеспокоен, если вы закончите работу с системой с 32-разрядным Linux на 64-разрядном оборудовании.

+1

... или система с 32-разрядным Linux на 32-разрядном оборудовании с физическими расширениями адресов и всей памятью выше границы 4 ГБ ([если вы думаете, что я шучу ...] (http://www.ti.com/product/66AK2H14)). – Notlikethat

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