【问题标题】:how to return a phys_addr_t type value to user space如何将 phys_addr_t 类型值返回给用户空间
【发布时间】:2016-08-17 22:33:34
【问题描述】:

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

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

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


someStruct.physAddr = virt_to_phys(virtAddr);

virt_to_phys 返回一个phys_addr_t,但是这种类型似乎不存在于任何标准包含中。所以我的问题是我需要在用户空间中为phys_addr_t 使用什么类型?

【问题讨论】:

  • 物理地址在内核之外是没有意义的。
  • @Barmar 我知道。但这不是我要问的问题。问题仍然存在,我需要在用户空间中使用什么类型,或者我需要在文件中包含什么才能看到 physAddr 的值?

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

在完整的内核源代码下,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/... 中的版本进行构建。

这不推荐用于常规程序 [当然]。但是,如果你正在做一个混合系统,在实用程序和驱动程序之间有很多事情,你可以按照你喜欢的任何方式来制作它。

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

【讨论】:

    【解决方案2】:

    它是 32 位或 64 位,无符号。见这里:http://lxr.free-electrons.com/source/include/linux/types.h#L161

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

    【讨论】:

    • ...或在 32 位硬件上安装 32 位 Linux 的系统,物理地址扩展和所有内存在 4GB 边界以上 (if you think I'm joking...)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多