Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将phys_addr_t type值返回到用户空间_C_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

C 如何将phys_addr_t type值返回到用户空间

C 如何将phys_addr_t type值返回到用户空间,c,linux,linux-kernel,linux-device-driver,C,Linux,Linux Kernel,Linux Device Driver,我需要我的驱动程序通过ioctl调用返回phys_addr_t type值。我需要通过一个通过arg传递的结构返回这个值。问题是我在这个结构中使用什么类型 例如,假设以下结构通过arg传递 struct myStruct { int input1; char input2; <type> physAddr; } ; someStruct.physAddr = virt_to_phys(virtAddr); virt_to_phys返回一个phys_addr_,但是在

我需要我的驱动程序通过ioctl调用返回phys_addr_t type值。我需要通过一个通过arg传递的结构返回这个值。问题是我在这个结构中使用什么类型

例如,假设以下结构通过arg传递

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


someStruct.physAddr = virt_to_phys(virtAddr);

virt_to_phys返回一个phys_addr_,但是在任何标准include中似乎都不存在这种类型。所以我的问题是,我需要在用户空间中为phys\u addr\u t使用什么类型?

它不是32位就是64位,无符号。请看这里:


您可能会在某种程度上使用intptr\t,但如果您最终在64位硬件上运行的是32位Linux系统,我会担心。

它是32位或64位的,无符号的。请看这里:


您可能会在某种程度上使用intptr\t,但如果您最终在64位硬件上运行32位Linux系统,我会感到担心。

在完整内核源代码下,在include/Linux/types.h中,我们有:

所以,为了安全起见,只需使用u64即可

请注意,此定义已从/usr/include/linux/types.h中删除

但是,如果您正在编写与自定义设备及其自定义驱动程序交互的自定义实用程序,则可以跳过/usr/include版本,直接根据/usr/src/kernel/中的版本进行构建

这是不推荐的常规计划[当然]。但是,如果你正在做一个混合动力系统,它在实用程序和驱动程序之间有很多东西,你可以随心所欲地设计它


例如,我为之编写代码的实时hidef视频编码平台就是这样做的。驱动程序向设备发送数据。设备将数据发回。数据被发送到实用程序/控制程序,该程序修改了数据并将其发回,等等。这一切都是通过大量自定义ioctl调用完成的,因此我们可以做任何需要做的事情。

在完整的内核源代码下,在include/linux/types中。h我们有:

所以,为了安全起见,只需使用u64即可

请注意,此定义已从/usr/include/linux/types.h中删除

但是,如果您正在编写与自定义设备及其自定义驱动程序交互的自定义实用程序,则可以跳过/usr/include版本,直接根据/usr/src/kernel/中的版本进行构建

这是不推荐的常规计划[当然]。但是,如果你正在做一个混合动力系统,它在实用程序和驱动程序之间有很多东西,你可以随心所欲地设计它


例如,我为之编写代码的实时hidef视频编码平台就是这样做的。驱动程序向设备发送数据。设备将数据发回。数据被发送到实用程序/控制程序,该程序修改数据并将其发回,等等。这一切都是通过大量自定义ioctl调用完成的,因此我们可以做任何需要做的事情。

物理地址在内核之外毫无意义。@Barmar我知道。但这不是我要问的问题。问题仍然存在,我需要在用户空间中使用什么类型,或者我需要在文件中包含什么才能看到physAddr的值?unsigned long?物理地址在内核之外毫无意义。@Barmar我知道。但这不是我要问的问题。问题仍然存在,我需要在用户空间中使用什么类型,或者我需要在文件中包含什么才能看到physAddr的值?unsigned long。。。或者在32位硬件上安装32位Linux的系统,具有物理地址扩展,所有内存都在4GB边界之上……或者在32位硬件上安装32位Linux的系统,具有物理地址扩展,所有内存都在4GB边界之上。
#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif