【问题标题】:Map virtual address back to physical address将虚拟地址映射回物理地址
【发布时间】:2012-04-18 13:33:55
【问题描述】:

免责声明:我想在Texas Instruments Forum 上交叉发布这个问题,但我已经五天没有收到任何回复了。我对嵌入式编程很陌生,所以请指出您是否需要更多信息或者我的方法是否荒谬。

动机

我有一个带有DM3730 processor from Texas Instruments 的嵌入式设备(与您在 Beagleboard -xm 上找到的相同)处理器通过其显示子系统 (DSS) 连接到 LCD 显示器。显示器看起来很暗,必须进行伽马校正。幸运的是,DSS 有一个 Palette/gamma 查找表。不幸的是,我无法让它工作。

我发现了什么

我在德州仪器论坛上找到了一个类似处理器的similar question,一位 TI 员工给出了以下解释(强调我的):

我认为当前的 Linux 内核不支持彩色索引图形,但通过直接寄存器配置从应用程序级别启用它相当容易。

[...]

接下来,声明一个由 256 个无符号整数组成的数组,并为每个颜色索引条目填充所需的 RGB 值。

将 DISPC_GFX_TABLE_BA 设置为先前配置的阵列的物理地址(注意 1,这需要物理地址而不是虚拟地址,因此您可能需要将其映射回来。注意 2,这需要是一个 32 位对齐的地址,因此根据数组的创建方式,可能需要创建一个稍大的 char 数组并填充数组,以使起点位于 32 位边界上)

[...]

他后来引用mem_util 来转换地址,我可以使用它直接从应用程序级别(用户空间)写入寄存器,但我不知道如何将虚拟地址“映射回”到物理地址。

系统信息

~# uname -a
Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown

我的问题

  • 如何将虚拟地址映射回物理地址?
  • 这可以在用户空间完成吗? (我设想我提供一个用户可以调整伽马曲线的界面)
  • 这是正确的方法吗?我应该把它移到内核空间吗(我不愿意这样做,因为我对 Linux 内核没有很多经验)
  • 任何好的资源或例子!

【问题讨论】:

    标签: c linux virtual-memory beagleboard texas-instruments


    【解决方案1】:

    您的问题的一个非常具体的答案是使用 CMEM,其目的是从启动时保留内存中分配连续的内存块。

    在下面的示例代码中,我通过编解码器引擎使用 cmem。 ptr 是您在应用程序中用来访问缓冲区的内容,而 physptr 是您在寄存器中写入的内容。

        ptr = Memory_contigAlloc(len, Memory_DEFAULTALIGNMENT);
        if(ptr == NULL) {
            debug_printf("Buffer allocation failed : buf size = %d\n", len);
            return -1;
        }
        physptr = (void *)Memory_getBufferPhysicalAddress(ptr, len, 0);
    

    “正确”的方法实际上是不使用 memutil 并在内核中完成所有事情。

    【讨论】:

    • 你认为我应该编写自己的内核模块还是应该向现有驱动程序添加一个函数,例如drivers/video/omap/dispc.c里面已经定义了寄存器DISPC_GFX_TABLE_BA,但是没有使用?
    • @Lucas 您应该使用 dispc 驱动程序,并在其中添加一个控件,但是您可能应该从 linux-omap 邮件列表寻求帮助。事实上,从用户空间找出正确的“入口点”(即ioctl,或framebuffer API,或V4L2 控制???)可能是最难的部分。你可以走捷径,先添加你自己的非标准ioctl,看看结果如何。从长远来看,内核中的解决方案是正确的。
    • 感谢您的帮助。我让它与 CMEM 一起工作,但我打算将它移到内核空间。
    【解决方案2】:

    有一个CMEM 驱动程序,用于将物理内存映射到用户空间内存。它也可以进行虚拟到物理的转换。

    因此,使用此驱动程序,您可以:

    1. 分配对齐的缓冲区
    2. 获取用户空间地址
    3. 从您的程序中填充缓冲区
    4. 获取缓冲区的物理地址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多